/ / Синтаксис для розширення кортежу, що використовується в enum при використанні оператора switch - swift, enums

Синтаксис для розширення кортежу, який використовується в переліку при використанні оператора switch - 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 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)
}

Оновлення 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)
}

Відповіді:

4 для відповіді № 1

Окрім вашого Оновлення: відповідь:

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

і

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

працювати також.

Маючи свою output: мітка у вашому enum У випадку, ви створили названий кортеж одного значення, що містить названий кортеж з двох значень. Якщо ви цього не робите, не вказуйте output: в switch, Swift спробує співставити зовнішній кортеж з кортежем, який ви постачаєте, і кількість предметів не відповідає.

Забезпечення output: мітка в шаблоні дозволяє Свіфту знати, що ви говорите про внутрішній кортеж, і він працює.

Якщо ти відчуваєш output: безглуздо, навіщо взагалі включати його у своє визначення перерахунків?