非可选值如何获得零值?

时间:2017-07-21 18:50:44

标签: swift

Apple documentation TN2151说明了EXC_BREAKPOINT / SIGTRAP的可能原因:

  

具有零值的非可选类型

但是像这样的代码不会编译:

var x = "hello"
x = nil

那么在什么情况下非可选的获得nil值?

4 个答案:

答案 0 :(得分:20)

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

- (NSObject * _Nonnull)someObject {
    return nil;
}

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

答案 1 :(得分:7)

已被控制但可能:

class C {}

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

print(y) // boom

答案 2 :(得分:1)

与Objective C互操作时发生.objc-method可以注释为nonnull,但没有任何东西可以阻止它返回nil。编译器只捕获最明显的情况,即使这样,它也只会产生警告(例如,当你在一个被指定为不返回nil的方法中分支return nil;时。)

答案 3 :(得分:-2)

我当然不知道,但是如果你强行将(!)一个Optional打包到Non-Optional变量中,可能会发生这种情况:

let a : String? = nil
var x = "hello"
x = a!

但这只是猜测...