swift returns 中的 Nil 合并运算符一个奇怪的结果
Nil coalescing operator in swift returns a weird result
谁能告诉我为什么 Xcode's Playground returns nil 如果我用双问号代替变量 a 的单问号?
由于溢出结果必须是 64,而不是 nil。
Swift 版本 2.2,
Xcode 版本 7.3.1,
OS X 版本 10.11.6
import Cocoa
var b: Int8
var c: String? = "128"
var a: Int8?? = Int8(c!)
b = 64
func nilCoalescing() {
a != nil ? a! : b
}
nilCoalescing()
128 转换为 Int8 时溢出,因此存储为 nil。
这里发生了很多事情:
a
溢出,因为 128
大于可以存储在 Int8
中的最大值(Int8.max
= 127
), 因此它将 return nil
.
这个nil
,a.k.a。 Optional.None
是类型Optional<Int8>
不是a
的类型注解指定的类型(Int8??
,a.k.a。Optional<Optional<Int8>>
),所以是包装在另一个可选中,成为 Optional.Some(Optional.None)
,现在是正确的类型。
nilCoalescing()
没有 return 任何东西。 (其实就是returns ()
, a.k.a. Void
)
不要执行此显式 nil
检查并强制解包 (!
):a != nil ? a! : b
。使用 ??
代替:a ?? b
你到底想在这里做什么?
谁能告诉我为什么 Xcode's Playground returns nil 如果我用双问号代替变量 a 的单问号? 由于溢出结果必须是 64,而不是 nil。
Swift 版本 2.2, Xcode 版本 7.3.1, OS X 版本 10.11.6
import Cocoa
var b: Int8
var c: String? = "128"
var a: Int8?? = Int8(c!)
b = 64
func nilCoalescing() {
a != nil ? a! : b
}
nilCoalescing()
128 转换为 Int8 时溢出,因此存储为 nil。
这里发生了很多事情:
a
溢出,因为128
大于可以存储在Int8
中的最大值(Int8.max
=127
), 因此它将 returnnil
.这个
nil
,a.k.a。Optional.None
是类型Optional<Int8>
不是a
的类型注解指定的类型(Int8??
,a.k.a。Optional<Optional<Int8>>
),所以是包装在另一个可选中,成为Optional.Some(Optional.None)
,现在是正确的类型。nilCoalescing()
没有 return 任何东西。 (其实就是returns()
, a.k.a.Void
)不要执行此显式
nil
检查并强制解包 (!
):a != nil ? a! : b
。使用??
代替:a ?? b
你到底想在这里做什么?