【问题标题】:No exact matches in call to initializer error message in swiftswift 中调用初始化程序错误消息时没有完全匹配
【发布时间】:2020-08-22 01:28:27
【问题描述】:

我很困惑。有人可以告诉我为什么当我有此代码时出现“调用初始化程序时没有完全匹配”错误....

    let bill = textField.text
    let billTotal = Double(bill)

但是当我强制打开 textField.text 时,错误消失了,一切都很好......

    let bill = textField.text!
    let billTotal = Double(bill)

我的想法是它应该仍然可以在没有强制展开的情况下工作,但如果 textField 为 nil,应用程序将会崩溃。

另外,为什么我不能使用可选项而不是强制展开?

 let bill = textField.text?
 let billTotal = Double(bill)

使用可选项会给我同样的错误:“调用初始化程序时没有完全匹配”

【问题讨论】:

  • textField.text 已经是可选的

标签: ios swift xcode


【解决方案1】:

发生错误是因为text 是可选的,并且初始化程序参数必须是非可选的。

我的想法是它应该仍然可以在没有强制展开的情况下工作,但如果 textField 为 nil,应用程序将会崩溃。

在这种情况下,强制展开没问题,因为 UITextFieldtext 属性永远不会是 nil,尽管它被声明为可选。

但是您应该检查创建的Double,因为输入的文本可能无法转换为Double,或者使用默认值

let billTotal = Double(textField.text!) ?? 0.0

或提供更高级的错误处理

if let billTotal = Double(textField.text!) {
    // do something with billTotal
} else {
    // handle the error
}

【讨论】:

    【解决方案2】:

    textField.text 已经是可选的了.. 你可以这样做

     if let bill = textField.text {
          let billTotal = Double(bill)
          }
    

    您也可以通过@Jessy 的建议来做到这一点,谢谢...

    let billTotal = textField.text.flatMap(Double.init)
    

    要在 Double 中转换 .. 它的初始化程序采用 S : StringProtocol 确认 StringProtocol ... 只有 String 和 标准库中的Substring 类型是有效的符合类型而不是Optional String

    【讨论】:

    • 很好的答案,但该初始化程序也可能失败。所以textField.text.flatMap(Double.init)是制作billTotal的方法。
    猜你喜欢
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 2022-11-19
    • 2022-01-15
    • 2020-10-29
    • 1970-01-01
    • 2020-09-16
    相关资源
    最近更新 更多