Apple文档提到:
Swift的nil与Objective-C中的nil不同。在Objective-C中,没有 是指向不存在的对象的指针。在Swift中,nil不是 指针 - 它缺少某种类型的值。可选项 任何类型都可以设置为nil,而不仅仅是对象类型
以上知识何时有用? 在适用的情况下,编译器会自动将Swift nil转换为Objective-C nil,反之亦然吗?
答案 0 :(得分:7)
是的,编译器会将Objective-C nils转换为Swift nils。这就是为什么当从Objective-C翻译时,所有指针都必须成为Swift中的选项。
这些知识的用处正好在你给出的描述中:
任何类型的选项都可以设置为nil,而不仅仅是对象类型
在Swift中,所有类型都可以选择,因此nil
。例如,在Objective-C中,您无法使NSInteger为零。
技术上nil
只是可选枚举中的一个案例:
enum Optional<T> {
case None
case Some(T)
}
nil
只是None
案例
答案 1 :(得分:2)
首先,这意味着只有选项可以有一个零值,例如:
// Objc:
Object *foo = nil;
foo = [Object new];
foo = nil;
// Swift
var foo: Object = nil // not allowed
var bar: Object = Object()
bar = nil // not allowed
var foo: Object? = nil // fine
foo = Object()
foo = nil
但更重要的应用是原始类型。如果objc中有一个int,并且它可能具有无效值,则需要确定该无效值并确保调用者和被调用者都知道它。
// Objc
int i = 0; // Is this valid?
i = -1 // What about this?
// Swift
var bar: int? = nil // Invalid.
bar = 0 // valid.
bar = -1 // valid.