【问题标题】:How nil can call functions in Objective-C and Swiftnil 如何在 Objective-C 和 Swift 中调用函数
【发布时间】:2017-04-13 10:08:30
【问题描述】:

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

在 Objective-C 中

nil 表示缺少 Objective-C 对象。 详细地说,id 是任何对象的指针。 nilid,表示什么都没有。

所以,任何原始类型都不能是 nils

例如。

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

在 Swift 中

nil 表示缺少任何称为可选的数据类型。 所以nil 是 Optional 的一种类型别名?

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

例如。

NSString *name = nil;
[a lowercaseString];

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

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

什么都没有和没有任何类型怎么能调用一个函数呢?

【问题讨论】:

    标签: objective-c swift null


    【解决方案1】:

    nil 是 Optional 的一种类型别名?

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

    name: String? = nil 
    name.lowercased()
    

    不,这是非法的。如果你在操场上尝试,自动完成会插入一个问号

    name?.lowercased()
    //  ^ here
    

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

    Objective-C 中的 nil 和 Swift 中的 nil 在“幕后”是根本不同的。 Objective-C 中的 nil 只是一个空指针。这就是为什么 Objective-C 中的原语不能为 nil 的原因:它们不是指针类型。

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

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

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

    Optional 本身就是一个类型,你不能在它上面调用被包装类型的方法,这就是为什么你必须首先用 ?后修复运算符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 2022-01-02
      相关资源
      最近更新 更多