好的,所以我知道在 Swift 中使用可选项的正常方法是通过可选绑定来解包它们,就像这样......
let stringA:String? = nil // (or "ABC")
if let unwrappedStringA = stringA
{
let x:String = unwrappedStringA
}
但是我也看到了以下使用隐式解包选项的方式,我个人认为它看起来更干净,因为它不仅不需要额外的变量,而且它还“读”得更好,更像英语(即“如果这是not nil, then...') 和可读性是 Swift 的核心原则之一(尤其是在即将到来的 Swift 3.0 中)。
let stringA:String! = nil // (or "ABC")
if stringA != nil
{
let x:String = stringA
}
然而,关于后者,斯威夫特的“纯粹主义者”将此称为“代码气味”,并坚持认为这是“糟糕、糟糕、糟糕!!”......但他们从不解释原因!所以……为什么会这么糟糕?
注意:是的,我知道 Optional 链接和其他此类功能,它们不能与隐式展开的选项一起使用,它们都是非常酷的功能,但我特别询问针对 nil 测试隐式展开的选项的技术缺点vs 可选绑定。
我希望的是一个比另一个更好的可量化的技术原因(即编译器优化、更好的安全检查、性能等)。换句话说,不仅仅是“嘿,因为那不是 'Swifty' 方式去做吧!' 希望这是有道理的。
更新
实际上,我只是找到了一种方法来解决我的一个问题(至少以肤浅的方式),即必须创建一个新变量来保存未包装的变量。这里的诀窍是,由于展开的变量实际上与可选变量本身位于不同的范围内,因此您可以使用完全相同的名称。
此外,在括号本身内部还有另一个范围,它也可以有一个名为 stringA 的变量。这意味着您现在可以拥有三个“stringA”变量(但并不意味着您应该!)...
- 可选的
- 展开的可选
- 括号内的一个新的局部变量
这是显示此内容的疯狂代码...
let stringA:String? = nil // (or "ABC") // First stringA variable
if let stringA = stringA
{
let x:String = stringA // <- This stringA is the unwrapped optional (the second stringA)
// Now we're just getting crazy (and smelly!)
let stringA = stringA + stringA // <- This is yet another stringA (third one!)
let y:String = stringA
}
再说一次,我不会宽恕这个!!我只是展示了一些其他人可能会从具有指导意义的角度觉得有趣的代码。我确实做到了!