Swift使用nil合并运算符简化可选的Int到String转换

时间:2017-07-23 05:22:52

标签: swift

说我有以下情况:

var str: String
var num: Int?

if let num = num {
    str = "\(num) foo"
}
else {
    str == "? foo"
}

流控制语句可以简化为一行吗?即类似的东西:

var str: String
var num: Int?

str = "\(String(num) ?? "?") foo"

4 个答案:

答案 0 :(得分:2)

您可以使用可选链接调用description属性,然后使用 nil coalescing operator ??来解包或替换它"?"如果numnil(导致可选链返回nil),则为str = "\(num?.description ?? "?") foo"

for num in [nil, 5] {
    let str = "\(num?.description ?? "?") foo"
    print(str)
}

示例:

? foo
5 foo
e.originalEvent.detail

答案 1 :(得分:1)

这是一个解决方案:

let str = "\(num.map { String($0) } ?? "?") foo"

如果"? foo"num,则会返回nil,如果"42 foo"设置为num,则返回42

答案 2 :(得分:1)

不完全是干净的衬里。

但是如果你在Optionals上写一个简单的扩展名,就像这样:

extension Optional where Wrapped: CustomStringConvertible {
    var nilDescription: String {
        switch self {
        case .none: return "?"
        case let .some(wrapped): return wrapped.description
        }
    }
}
你可以写

let str = "\(num.nilDescription) foo"

我认为这种方法更具可读性。

答案 3 :(得分:0)

你也可以写下面的内容。

var number:Int? = 0
var str = String(format: "%@ foo", (number != nil) ? NSNumber(integer: number!) : "?");

希望它会对你有所帮助。