考虑我有一个包含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)
}
答案 0 :(得分:4)
除了更新:回答:
case .FirstCase(output: let (someString, someInt)):
和
case let .FirstCase(output: (someString, someInt)): // thanks @MartinR
也可以。
通过在output:
情况下使用enum
标签,您创建了一个包含两个值的命名元组的值的元组。如果你没有在output:
中指定switch
,Swift会尝试将外部元组与你提供的元组匹配,并且项目的数量不匹配。
在模式中提供output:
标签允许Swift知道您正在谈论内部元组,然后它可以工作。
如果您认为output:
毫无意义,为什么要将它包含在您的枚举定义中呢?