为Swift中的Optional提供默认值?

Wes*_*gne 133 optional swift

在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方法

:我开始一个模块来添加共同佣工像这样orOptional以迅速.

  • 我的版本错了.我在6.4.请注意:`??``默认类型推断行为是它返回一个可选的,这通常不是你想要的.您可以将变量声明为非可选,这很有效. (2认同)

Mir*_*ekE 28

截至2014年8月,Swift拥有合并运算符(??),允许这样做.例如,对于可选的String myOptional,您可以编写:

result = myOptional ?? "n/a"
Run Code Online (Sandbox Code Playgroud)


UnR*_*ewa 5

如果你写道:

let result = optionalValue ?? 50
Run Code Online (Sandbox Code Playgroud)

optionalValue != nil随后resultoptional过,你会需要它展开未来

但是你可以写操作符

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 != nilresultunwraped