无法在可选绑定中使用可选 int "possibleNumber"

Posted

技术标签:

【中文标题】无法在可选绑定中使用可选 int "possibleNumber"【英文标题】:unable to use optional int "possibleNumber" in optional binding 【发布时间】:2016-02-25 10:26:28 【问题描述】:

我是 Swift 新手,正在尝试学习可选绑定的概念。我想出了以下代码:

let possibleNumber = Int("123")
possibleNumber.dynamicType
if let actualNumber = Int(possibleNumber)
    print("\(possibleNumber) has an integer value of \(actualNumber)")
 else 
    print("\(possibleNumber) could not be converted to an int")

Xcode Playground 输出错误信息:

value of optional type "int?" not unwrapped, did you mean to use "!" or "?"

但是,当我添加“!”给if let actualNumber = Int(possibleNumber!)

let possibleNumber = Int("123")
possibleNumber.dynamicType
if let actualNumber = Int(possibleNumber!)
    print("\(possibleNumber) has an integer value of \(actualNumber)")
 else 
    print("\(possibleNumber) could not be converted to an int")

Xcode 显示另一个错误信息:

initialiser for conditional binding must have Optional type, not int

为什么会这样?

【问题讨论】:

【参考方案1】:

结果

let possibleNumber = Int("123")

是一个可选的 Int - Int?

然后你尝试用

创建另一个Int
Int(possibleNumber)

这不起作用,因为初始化程序需要一个非可选类型。 错误消息与初始化程序有关,而不是与可选绑定有关。

试试这个以获得相同的错误消息。

let possibleNumber = Int("123")
let x = Int(possibleNumber)

在第二个示例中,当您使用隐式展开的 Int! 参数初始化 Int 时,您会得到一个非可选的 Int 并且编译器会抱怨缺少可选参数。

【讨论】:

我是否正确地说,对于第二个示例,语句 if let actualNumber = Int(possibleNumber), actualNumber 应该是可选类型,但是,Int(possibleNumber!) 是相等的到非可选的 int 类型,这就是 XCode 抱怨的原因?【参考方案2】:

if let 构造中

if let actualNumber = Int(possibleNumber!)
    print("\(possibleNumber) has an integer value of \(actualNumber)")

您不需要使用 Int 初始化程序。你只需要写

if let actualNumber = possibleNumber 
    print("\(possibleNumber) has an integer value of \(actualNumber)")

现在 Swift 将尝试解开 possibleNumber。如果操作成功,则将展开的值放入 actualNumber 并执行 THEN 块。

【讨论】:

以上是关于无法在可选绑定中使用可选 int "possibleNumber"的主要内容,如果未能解决你的问题,请参考以下文章

Swift:可以在可选绑定期间释放弱引用吗?

可选绑定,这里的“绑定”这个词到底是啥意思?

必需参数 $xxx 跟在可选参数 $yyy 之后

必需参数 $xxx 跟在可选参数 $yyy 之后

如何在可选类型中使用 numpy

为啥必须在可选链接之前使用点运算符 - 在函数之前? [复制]