说我有以下情况:
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"
答案 0 :(得分:2)
您可以使用可选链接调用description
属性,然后使用 nil coalescing operator ??
来解包或替换它"?"
如果num
为nil
(导致可选链返回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!) : "?");
希望它会对你有所帮助。