1

可选链让我们决定对象的存在:

var text : String?
let len = text?.lengthOfBytes(using: .utf8) ?? 0

它将始终设置len为整数。

非可选函数参数是否有类似的可能?考虑下面的例子,三元运算符已经不太优雅了。

func length(text: String) -> Int {
    return text.lengthOfBytes(using: .utf8)
}

var text : String?
let len = (text != nil) ? length(text!) : 0

如果我们继续链接,它很容易变得一团糟(这就是我真正看到的)

let y = (arg!= nil) ? (foo?.bar(arg!) ?? 0) : 0 // how to improve on this?

此外,它也开始变得多余,定义了两次默认值。

最后一行还有更简洁的解决方案吗?

4

3 回答 3

1

map方法是最好的方法。flatMap也可能感兴趣。

func length(text: String) -> Int {
    return text.lengthOfBytes(using: .utf8)
}

var text : String?
let len = text.map(length) ?? 0

如果你有多个参数,你可以很容易地编写一个函数(A?, B?) -> (A, B)?

于 2018-09-21T00:25:58.110 回答
0

考虑到使用??会影响编译时间。在您描述的示例中,我个人喜欢使用易于使用的扩展。

extension Optional where Wrapped == String {
    func unwrappedLengthOfBytes(using: String.Encoding) -> Int {
        guard let text = self else {
            return 0
        }
        return text.lengthOfBytes(using: .utf8)
    }
}

用法:

var text : String?
text.unwrappedLengthOfBytes(using: .utf8)
于 2018-01-03T11:37:04.117 回答
0

您不必将自己限制在可选链接中。Swift 提供了其他语言结构来清楚地表达这一点:

let y: Int
if let arg = arg, let foo = foo {
    y = foo.bar(arg)
} else {
    y = 0
}
于 2018-01-03T16:04:22.687 回答