Подумайте, у мене є перелік із 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:
безглуздо, навіщо взагалі включати його у своє визначення перерахунків?