【问题标题】:Swift Optional PatternsSwift 可选模式
【发布时间】:2015-07-16 12:12:39
【问题描述】:

Swift 可选模式允许您像这样使用 case let

var arrayOfOptional: [Int?] = [1, 2, nil, 4]

for case let number? in arrayOfOptional {
  print("\(number)")
}

让我感到困惑的是 let number? 语法。在可选绑定中,展开的版本没有 ?,但如果是 let,则有。你如何解释这个结构,以使数字未包装对你有意义?

从功能上来说,下面两者有什么区别:

if let x = someOptional {
  print(x)
}

if case let x? = someOptional {
  print(x)
}

【问题讨论】:

  • x? 只是模式中.Some(x) 的快捷方式(如Optional Patterns 中所述)。您的问题是为什么 Apple 选择了这种特定的语法吗? (我想苹果开发者论坛上已经讨论过这是否直观。)
  • 这种语法与可选绑定相反,它在没有你指定 ? 的情况下展开,试图找到一种方法来解释它,以便我可以更容易地记住行为。此外,鉴于这是 .Some(x) 的快捷方式,如果您直接执行 x 而不使用 怎么办? (例如,如果 case let x) - 那映射到什么?
  • if case let x = y { } 完全没用。它总是正确的并将y 分配给x。但是if case let x as SubClass = y { } 在功能上等同于if let x = y as? SubClass { }。 – 可选模式比可选绑定更通用,它们可以用在 switch/if/while/for 语句中,只是语法不同(可能不直观)。

标签: swift


【解决方案1】:

我刚刚测试了你的第一个代码,以前从未用于模式匹配,但这是我的假设:

var arrayOfOptional: [Int?] = [1, 2, nil, 4]

for case let number in arrayOfOptional {
    print("\(number)")
}
// will return 3 optional ints and a nil

for case let number? in arrayOfOptional {
    print("\(number)")
}
// will return only any values that could be unwrapped

我假设这是一个模式,它可以在后台解开任何可选值,并且只有在可以解开并且愿意的情况下才会继续。

if case let x? = someOptional {
    print(x)
}

case let 用于模式匹配,如switch x { case let ... }。在您的示例中,它还将尝试解开可选值。如果是 nil 就会失败

【讨论】:

  • 对 - 我发现这种模式令人困惑,基本上是添加 ?与没有它相反(尤其是与可选绑定相比)。试图找到一种方法来解释这一点,以便我能更好地记住。
  • 这个也很方便(Swift 2.0):guard instance.dynamicType is AnyClass else { /* nope it's a structure type, do something here */ } 但它的 atm 有问题。仅当您的实例是一个类时,这才是正确的,否则它将失败。它会忽略到 ObjC 的桥接。很高兴知道。
猜你喜欢
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多