nil如何调用Objective-C和Swift中的函数

时间:2017-04-13 10:08:31

标签: objective-c swift null

nil在Objective-C和Swift中是相似但不同的概念。

在Objective-C

nil表示没有Objective-C对象。 详细地说,id是任何对象的指针。 nil id表示无效。

因此,任何原始类型都不能是nils

例如。

NSString *a = nil (o)
int a = nil (x)

在Swift中

nil表示没有任何名为Optional的数据类型。 所以nil是Optional的类型吗?

两种语言,任何nil类型对象都可以调用函数。

例如。

NSString *name = nil;
[a lowercaseString];

let name: String? = nil
name.lowercased()

两种情况都不会发生零点异常。

怎么能不提出任何类型而且没有任何类型可以调用函数?

1 个答案:

答案 0 :(得分:3)

  

nil是Optional的一种类型吗?

没有。 nilOptional<T>.none的语法糖,其中T是由可选项包装的类型。

name: String? = nil 
name.lowercased()

不,这是非法的。如果您在游乐场尝试,自动填充将插入问号

name?.lowercased()
//  ^ here

这基本上意味着如果name不是nil,打开它并调用lowercased()否则返回nil。

Objective-C中的nil和Swift中的nil在根本上是不同的&#34;在引擎盖下#34;。 Objective-C中的nil只是一个空指针。这就是为什么Objective-C中的原语不能为零:它们不是指针类型。

如果你尝试在Objective-C中向nil发送消息,它会有效,因为消息发送功能会检查接收者,如果它是nil,它只返回0,调用者将根据返回值解释类型,它期待例如如果它期望一个int,它将得到0,如果它期望一个Bool它将得到假,如果它期望一个id,它将得到nil。

如上所述,在Swift中,nil是可选枚举的一个值的语法糖。

enum Optional<T>
{
    case some(T)
    case none
}

可选是一个独立的类型,你不能在其上调用包装类型的方法,这就是为什么你必须先用它打开它的原因? post fix operator。