gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:52:11 26 4
gpt4 key购买 nike

考虑我有一个包含 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)
}

更新:

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

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)
}

所以如果我想删除输出:我会这样做:

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)
}

最佳答案

除了您的更新:回答:

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

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

工作也一样。

通过在您的 enum 案例中使用 output: 标签,您已经创建了一个具有一个值的命名元组,其中包含一个具有两个值的命名元组。如果您没有在 switch 中指定 output:,Swift 将尝试将外部元组与您提供的元组进行匹配,但项目的计数不会匹配。

在模式中提供 output: 标签可以让 Swift 知道你在谈论内部元组,然后它就可以工作了。

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

关于swift - 使用 switch 语句时扩展枚举中使用的元组的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34119129/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com