Swift:用 '!'定义函数参数有什么区别

标签 swift function parameters option-type

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

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)

因此函数 tame 和 tame2 之间没有区别。 如果参数有可能为nil,我应该把参数定义为可选的吧?

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

在什么情况下,我应该将函数的参数定义为像 tame2 这样的隐式解包可选?

最佳答案

In which case should I define a function's parameter as implicitly unwrapped optional like tame2?

简短回答:从不。

If the parameter has a possibility of being nil, I should define the parameter as an optional right?

没错。


隐式展开的可选项对于无法在 init 方法中初始化但应该始终具有值的属性很有用,并且为了将 Objective-C API 桥接到 Swift 的兼容性,没有别的。

关于Swift:用 '!'定义函数参数有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48473681/

相关文章:

swift - 仅使用两个 View Controller 循环 - 显示用户关注者的用户配置文件

javascript - JS |方法|将两个函数的结果添加到第三个函数 |解决方案?

excel - 编写一个vba excel函数,不知道参数是字符串还是字典

function - 初学者阅读 Fortran 代码但无法理解这一点

swift - 我可以将元组与 AnyObject 一起使用吗?

ios - 添加并布局从 xib 加载到自定义单元格的 subview

swift - dyld : Library not loaded: @rpath/libswiftDispatch. 动态库

function - 简单的InputBox函数

javascript - 我需要添加一个加载一次的 JavaScript 加载函数

php - 是否可以对具有串联变量的查询进行参数化?