非可选值如何获得零值?

Gru*_*kes 14 swift

苹果文档TN2151说,这对于一个可能的原因EXC_BREAKPOINT/ SIGTRAP:

具有nil值的非可选类型

但是像这样的代码将无法编译:

var x = "hello"
x = nil
Run Code Online (Sandbox Code Playgroud)

那么在什么情况下可以非选择性地获得一个nil值?

JAL*_*JAL 20

在与Swift桥接的Objective-C中考虑这样的事情:

- (NSObject * _Nonnull)someObject {
    return nil;
}
Run Code Online (Sandbox Code Playgroud)

该函数注释为_Nonnull,但将返回nil.这作为Swift的非可选对象桥接并将崩溃.

  • 这是最常见的原因.有一堆iOS(和macOS)API错误地标记为`_Nonnull`. (4认同)

Ale*_*ica 7

被诅咒但可能:

class C {}

let x: C? = nil
let y: C = unsafeBitCast(x, to: C.self)

print(y) // boom
Run Code Online (Sandbox Code Playgroud)

  • 只是一个评论:unsafeBitCast成功,因为对于引用类型,`C`和`C?`的实例是指针,因此具有相同的大小.使用`struct C {}`unsafeBitCast已经崩溃(不能在不同大小的类型之间进行unsafeBitCast). (3认同)
  • 或者只是`unsafeBitCast(0,to:C.self)` (2认同)
  • 回到[目标 - ] C演员射击自己的脚,总是优雅:) (2认同)