【问题标题】:Two (or more) optionals in SwiftSwift 中的两个(或更多)选项
【发布时间】:2014-12-01 09:26:00
【问题描述】:

在观看有关 LLDB 调试器的 Apple 视频时,我发现了一些我无法解释的问题;他在写的时候谈论的是可选值:

var optional: String? = nil; //This is ok, a common optional
var twice_optional: String?? = nil; //What is this and why's this useful??

我打开了一个 Playground 并开始尝试,发现你可以写任意数量的 ?,然后用相同数量的 ! 解开它们。我了解包装/解包装变量的概念,但想不出我想将值包装 4、5 或 6 次的情况。

【问题讨论】:

    标签: ios swift optional


    【解决方案1】:

    (针对 Swift >=3 更新)

    “双选项”很有用,Swift 博客条目"Optionals Case Study: valuesForKeys" 描述了一个应用程序。

    这是一个简化的例子:

    let dict : [String : String?] = ["a" : "foo" , "b" : nil]
    

    是一个以可选字符串作为值的字典。因此

    let val = dict[key]
    

    具有String?? 又名Optional<Optional<String>> 的类型。它是.none(或nil) 如果字典中不存在该键,否则为.some(x)。在第二 情况下,xString? 又名 Optional<String> 并且可以是 .none(或 nil) 或.some(s),其中s 是一个字符串。

    您可以使用嵌套的可选绑定来检查各种情况:

    for key in ["a", "b", "c"] {
    
        let val = dict[key]
        if let x = val {
            if let s = x {
                print("\(key): \(s)")
            } else {
                print("\(key): nil")
            }
        } else {
            print("\(key): not present")
        }
    
    }
    

    输出:

    a: foo
    b: nil
    c: not present
    

    看看如何通过模式匹配实现同样的效果可能会很有启发性 在 switch 语句中:

    let val = dict[key]
    switch val {
    case .some(.some(let s)):
        print("\(key): \(s)")
    case .some(.none):
        print("\(key): nil")
    case .none:
        print("\(key): not present")
    }
    

    或者,使用x? 模式作为.some(x) 的同义词:

    let val = dict[key]
    switch val {
    case let (s??):
        print("\(key): \(s)")
    case let (s?):
        print("\(key): nil")
    case nil:
        print("\(key): not present")
    }
    

    (我不知道更深层次嵌套选项的合理应用程序。)

    【讨论】:

    • 另外,为了详尽,try? ... as? ... 将返回一个双可选。
    • @Cœur:是的,但这可以用括号解决:if let value = (try? ...) as? ... { ... },因为可选的可选绑定不会添加另一个可选级别。
    • 那么,另一个例子,UIApplication.shared.delegate?.window 是一个双选项。您需要添加 ?? 才能打开窗口。
    【解决方案2】:
    var tripleOptional: String???
    

    相同
    var tripleOptional: Optional<Optional<Optional<String>>>
    

    我想不出它有什么用处,但它就在那里,因为可选项对于任何类型的对象都是通用的。嵌套选项就像盒子放入另一个盒子或数组,但放入另一个数组。

    【讨论】:

    • 是的,你是对的。但在某些情况下,即使是数组数组的数组也很有用。鉴于可选值是语言内置的,我认为它们可以控制可以将值包装在可选类型中的次数,即使 Optional 接受任何类型也是如此。好吧,让我们看看是否有人睁开眼睛
    • 但是你为什么要限制它呢?如果你把可选性限制在四个级别,99.99% 的开发者永远不会注意到,0.01% 的人会非常非常生气。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多