关于Swift编码风格的两难选择:
假设我们有两个变量,它们都可以是nil(Optionals),我们必须得到其中一个变量的值,如果两者都是零,则必须提前返回。
在 Objective-C 中,它将以这种方式编写:
- (void)authenticate:(Account*)anAccount {
Account* account = anAccount ?: self.defaultAccount();
if (!account) return;
doLotsOfThings(account);
}
我可以想出几种在Swift中重写它的方法,但是所有这些方法都引入了代码味道。
Swift :代码重复
func authenticate(_account: Account?) {
if let account = _account {
self.doLotsOfThings(account)
} else if let account = self.defaultAccount {
self.doLotsOfThings(account)
}
}
Swift :这解决了代码重复问题,但感觉不是非常迅捷。
func authenticate(_account: Account?) {
if _account == nil && self.defaultAccount == nil { return }
let account = _account == nil ? self.defaultAccount! : _account!
self.doLotsOfThings(account)
}
问题是;有没有办法使用guard
执行此操作?如果没有,有没有更好的方法来处理这种情况?
感谢。
答案 0 :(得分:4)
这是nil-coalescing运算符??
的用例:
func authenticate(_account: Account?) {
if let account = _account ?? self.defaultAccount {
self.doLotsOfThings(account)
}
}
或早期返回guard
:
func authenticate(_account: Account?) {
guard let account = _account ?? self.defaultAccount else {
return
}
self.doLotsOfThings(account)
}
表达式
_account ?? self.defaultAccount
如果_account
,则评估为_account != nil
否则self.defaultAccount
。
同样??
是一个“短路”运算符,如&&
和||
,
这意味着在
在您的情况下,self.defaultAccount
甚至不会被评估
_account != nil
。