swift 2中引入的可选模式的优点/用例有哪些?

时间:2016-04-27 04:06:49

标签: swift swift2 switch-statement pattern-matching optional

对于像if letguard这样的简单案例,我看不到优势,

if case let x? = someOptional where ... {
  ...
}

//I don't see the advantage over the original if let

if let x = someOptional where ... {
  ...
}

对于简化使用可选集合的for-case-let案例,我真的希望swift可以更进一步:

for case let x? in optionalArray {
  ...
}

//Wouldn't it be better if we could just write

for let x? in optionalArray {
  ...
}

google一段时间之后,我发现唯一有用的案例是“Swift 2 Pattern Matching: Unwrapping Multiple Optionals”:

switch (username, password) {
case let (username?, password?):
    print("Success!")
case let (username?, nil):
    print("Password is missing")
...

引入可选模式的其他优点是什么?

1 个答案:

答案 0 :(得分:5)

我相信你会把两个不同的概念混为一谈。不可否认,语法并不直观,但我希望它们的用法在下面说明。 (我建议阅读有关Patterns in The Swift Programming Language的页面。)

case条件

"案件条件"是指写作的能力:

  • if case «pattern» = «expr» { ... }
  • while case «pattern» = «expr» { ... }
  • for case «pattern» in «expr» { ... }

这些特别有用,因为它们可让您在不使用switch 的情况下提取枚举值

您的示例if case let x? = someOptional ...就是一个有效的示例,但我认为它对除之外的枚举最有用。

enum MyEnum {
    case A
    case B(Int)
    case C(String)
}

func extractStringsFrom(values: [MyEnum]) -> String {
    var result = ""

    // Without case conditions, we have to use a switch
    for value in values {
        switch value {
        case let .C(str):
            result += str
        default:
            break
        }
    }

    // With a case condition, it's much simpler:
    for case let .C(str) in values {
        result += str
    }

    return result
}

您实际上可以使用案例条件,其中包含您通常在switch中使用的任何模式。有时可能很奇怪:

  • if case let str as String = value { ... }(相当于if let str = value as? String
  • if case is String = value { ... }(相当于if value is String
  • if case 1...3 = value { ... }(相当于if (1...3).contains(value)if 1...3 ~= value

可选模式,a.k.a。let x?

另一方面,可选模式是一种模式,除了简单的if let之外,它还允许您在上下文中解包选项。在[{1}} 中使用时非常有用(类似于您的用户名/密码示例):

switch