使用switch语句时扩展枚举中使用的元组的语法

时间:2015-12-06 15:30:12

标签: swift enums

考虑我有一个包含2个案例的枚举,其中一个有元组:

enum MyEnum {
  case FirstCase(output: (someString:  String, someInt: Int))
  case SecondCase(error: ErrorType)
}

当我创建枚举常量时:

let myEnum = MyEnum.FirstCase(output: (someString: "myString", someInt: 3))

我可以使用switch语句并对每个案例执行一些操作

switch myEnum {
case .FirstCase(let output):
  print(output.someInt) // prints 3
  // OR
  let (someString, someInt) = output
  print(someInt) // prints 3
case .SecondCase(let error):
  print(error)
}

以下代码存在编译器错误。如何扩展案例中的元组?这是语法问题还是Swift的限制?

switch myEnum {
case .FirstCase(let (someString, someInt)): // This causes a compiler error " Tuple pattern has the wrong length for tuple type '(output: (someString: String, someInt: Int))'"
  print(someInt)
case .SecondCase(let error):
  print(error)
}

更新

这很接近,但output:似乎毫无意义

switch myEnum {
case .FirstCase(output: (let someString, let someInt)):
  print(someInt) // prints 3
case .SecondCase(let error):
  print(error)
}

从vacawama的回答中更新2

语法实际上有意义,因为我可以

enum OtherEnum {
  case FirstCase(output: (someString:  String, someInt: Int), outputB: (someString:  String, someInt: Int))
  case SecondCase(error: ErrorType)
}

let otherEnum = OtherEnum.FirstCase(output: (someString: "myString", someInt: 3), outputB: (someString: "myString", someInt: 3) )


switch otherEnum {
case .FirstCase(output: (let someString, let someInt), outputB: (let someStringB, let someIntB)):
  print(someString)
case .SecondCase(let error):
  print(error)
}

所以,如果我想删除output:,我会这样做:

enum SimpleEnum {
  case FirstCase(someString: String, someInt: Int)
  case SecondCase(error: ErrorType)
}

let simpleEnum = SimpleEnum.FirstCase(someString: "myString", someInt: 3)

switch simpleEnum {
case .FirstCase(let someString, let someInt):
  print(someString)
case .SecondCase(let error):
  print(error)
}

1 个答案:

答案 0 :(得分:4)

除了更新:回答:

case .FirstCase(output: let (someString, someInt)):

case let .FirstCase(output: (someString, someInt)):  // thanks @MartinR

也可以。

通过在output:情况下使用enum标签,您创建了一个包含两个值的命名元组的值的元组。如果你没有在output:中指定switch,Swift会尝试将外部元组与你提供的元组匹配,并且项目的数量不匹配。

在模式中提供output:标签允许Swift知道您正在谈论内部元组,然后它可以工作。

如果您认为output:毫无意义,为什么要将它包含在您的枚举定义中呢?