Swift nil与Objective-C nil不同

时间:2014-06-23 17:56:13

标签: objective-c swift

Apple文档提到:

  

Swift的nil与Objective-C中的nil不同。在Objective-C中,没有   是指向不存在的对象的指针。在Swift中,nil不是   指针 - 它缺少某种类型的值。可选项   任何类型都可以设置为nil,而不仅仅是对象类型

以上知识何时有用? 在适用的情况下,编译器会自动将Swift nil转换为Objective-C nil,反之亦然吗?

2 个答案:

答案 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.