【发布时间】:2014-11-28 19:52:55
【问题描述】:
假设您需要编写将闭包作为参数之一的函数,以将其作为回调调用。这个函数的用户应该能够传递nil 而不是闭包。在这种情况下,你会使用可选项还是隐式展开的可选项?
提前致谢。
【问题讨论】:
假设您需要编写将闭包作为参数之一的函数,以将其作为回调调用。这个函数的用户应该能够传递nil 而不是闭包。在这种情况下,你会使用可选项还是隐式展开的可选项?
提前致谢。
【问题讨论】:
作为对 Nate 的回答(这是 imo 解决方案)的补充,我的建议是永远不要使用隐式展开的选项,除非你有充分的理由。延迟初始化是一个很好的理由。
如果不确定,请不要使用它
如果可选项在其初始化后的生命周期内可以为 nil,则不要使用它
如果您想避免输入额外的?,请不要使用它
如果第 3 方函数、方法或闭包传递了可选项,请不要将其转换为隐式展开
如果第 3 方函数、方法或闭包提供隐式解包...自行判断是否显式检查 not nil(即是否相信该 optional 将始终不是 nil)
更一般地说,如果您对隐式展开的工作方式有疑问,最好始终避免
【讨论】:
这里一定要使用可选的,因为期望它可能是nil。当使用隐式展开的选项时,其目的是在使用它们时它们永远不会是nil - 典型示例是@IBOutlet 属性,这些属性不能在初始化程序中创建,但将通过在 viewDidLoad 中使用之前的故事板。
【讨论】:
handler?() 语法以防隐式解包选项
handler?() 语法并不是使用隐式展开可选的情况。您也可以将该语法与标准可选项一起使用,标准可选项使您的意图更加明确。我同意 Nate 的观点,标准可选在这里似乎更合适。