在Swift中处理选项的习惯用法似乎过于冗长,如果你想做的就是在nil的情况下提供一个默认值:
if let value = optionalValue {
// do something with 'value'
} else {
// do the same thing with your default value
}
Run Code Online (Sandbox Code Playgroud)
这涉及不必要地复制代码,或
var unwrappedValue
if let value = optionalValue {
unwrappedValue = value
} else {
unwrappedValue = defaultValue
}
Run Code Online (Sandbox Code Playgroud)
这unwrappedValue
不一定是常数.
Scala的Option monad(与Swift的Optional基本相同)具有getOrElse
用于此目的的方法:
val myValue = optionalValue.getOrElse(defaultValue)
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?斯威夫特有一个紧凑的方式吗?或者,如果失败,是否可以getOrElse
在可选的扩展中定义?
dre*_*wag 270
更新
Apple现在已经添加了一个合并运营商:
var unwrappedValue = optionalValue ?? defaultValue
Run Code Online (Sandbox Code Playgroud)
在这种情况下,三元运算符是您的朋友
var unwrappedValue = optionalValue ? optionalValue! : defaultValue
Run Code Online (Sandbox Code Playgroud)
您还可以为Optional枚举提供自己的扩展:
extension Optional {
func or(defaultValue: T) -> T {
switch(self) {
case .None:
return defaultValue
case .Some(let value):
return value
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以这样做:
optionalValue.or(defaultValue)
Run Code Online (Sandbox Code Playgroud)
但是,我建议坚持使用三元运算符,因为其他开发人员可以更快地理解,而无需调查or
方法
注:我开始一个模块来添加共同佣工像这样or
的Optional
以迅速.
Mir*_*ekE 28
截至2014年8月,Swift拥有合并运算符(??),允许这样做.例如,对于可选的String myOptional,您可以编写:
result = myOptional ?? "n/a"
Run Code Online (Sandbox Code Playgroud)
如果你写道:
let result = optionalValue ?? 50
Run Code Online (Sandbox Code Playgroud)
并 optionalValue != nil
随后result
将optional
过,你会需要它展开未来
但是你可以写操作符
infix operator ??? { associativity left precedence 140 }
func ???<T>(optLeft:T?, right:T!) -> T!
{
if let left = optLeft
{
return left
}
else { return right}
}
Run Code Online (Sandbox Code Playgroud)
现在你可以:
let result = optionalValue ??? 50
Run Code Online (Sandbox Code Playgroud)
而当 optionalValue != nil
再 result
会unwraped
归档时间: |
|
查看次数: |
59048 次 |
最近记录: |