Swift:如果两个可选值都为零,则提前 return?
Swift: Early return if both optionals are nil?
Swift 中的编码风格有点进退两难:
假设我们有 2 个变量,它们都可以为 nil(可选),我们必须获取其中一个的值,或者 return 如果两者都为 nil,则尽早获取。
在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:这个解决了代码重复但是感觉不是很Swift-y.
func authenticate(_account: Account?) {
if _account == nil && self.defaultAccount == nil { return }
let account = _account == nil ? self.defaultAccount! : _account!
self.doLotsOfThings(account)
}
问题是;有没有办法使用 guard
来做到这一点?如果没有,有没有更好的方法来处理这种情况?
谢谢。
这是 use-case 运算符 nil-coalescing ??
:
func authenticate(_account: Account?) {
if let account = _account ?? self.defaultAccount {
self.doLotsOfThings(account)
}
}
或 early-return 与 guard
:
func authenticate(_account: Account?) {
guard let account = _account ?? self.defaultAccount else {
return
}
self.doLotsOfThings(account)
}
表达式
_account ?? self.defaultAccount
如果 _account != nil
计算为 _account
,并且为
self.defaultAccount
否则。
另外 ??
是一个 "short-circuiting" 运算符,如 &&
和 ||
,
这意味着在
你的情况 self.defaultAccount
甚至没有被评估如果
_account != nil
.
Swift 中的编码风格有点进退两难:
假设我们有 2 个变量,它们都可以为 nil(可选),我们必须获取其中一个的值,或者 return 如果两者都为 nil,则尽早获取。
在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:这个解决了代码重复但是感觉不是很Swift-y.
func authenticate(_account: Account?) {
if _account == nil && self.defaultAccount == nil { return }
let account = _account == nil ? self.defaultAccount! : _account!
self.doLotsOfThings(account)
}
问题是;有没有办法使用 guard
来做到这一点?如果没有,有没有更好的方法来处理这种情况?
谢谢。
这是 use-case 运算符 nil-coalescing ??
:
func authenticate(_account: Account?) {
if let account = _account ?? self.defaultAccount {
self.doLotsOfThings(account)
}
}
或 early-return 与 guard
:
func authenticate(_account: Account?) {
guard let account = _account ?? self.defaultAccount else {
return
}
self.doLotsOfThings(account)
}
表达式
_account ?? self.defaultAccount
如果 _account != nil
计算为 _account
,并且为
self.defaultAccount
否则。
另外 ??
是一个 "short-circuiting" 运算符,如 &&
和 ||
,
这意味着在
你的情况 self.defaultAccount
甚至没有被评估如果
_account != nil
.