Swift:用'!'定义函数参数有什么不同吗

时间:2018-01-27 07:36:04

标签: swift function parameters optional

我有时会看到一个接受一个对象作为参数的函数,该参数有'!'作为后缀。 我知道这意味着参数是一个隐式解包的可选项。 但我不知道这两种情况有什么区别。即用'!'定义参数没有'!'。

class Cat {
    var name: String
    init(name: String) {
        self.name = name
    }
}

func tame(cat: Cat) {
    print("Hi, \(cat.name)")
}

func tame2(cat: Cat!) {
    print("Hi, \(cat.name)")
}

let cat = Cat(name: "Jack")
tame(cat: cat)
tame2(cat: cat)

因此,功能驯服和tame2之间没有区别。 如果参数有可能是nil,我应该将参数定义为可选的权利吗?

func tame3(cat: Cat?) {
    if let cat = cat {
        print("Hi, \(cat.name)")
    }
}

在哪种情况下,我应该将函数的参数定义为隐式展开的可选项,例如 tame2

1 个答案:

答案 0 :(得分:3)

  

在哪种情况下,我应该将函数的参数定义为隐式解包的可选项,如tame2

简短回答:从不。

  

如果参数有可能是nil,我应该将参数定义为可选权利吗?

右。

隐式解包选项对于无法在init方法中初始化但应该始终具有值的属性以及将Objective-C API桥接到Swift的兼容性非常有用,没有别的。