Swift: получить элемент из кортежа
Если у меня есть кортеж вроде этого
var answer: (number: Int, good: Bool)
Как получить один из элементов?
Это не работает:
answer["number"]
Я моделирую этот вопрос после Swift: получить массив элементов из массива кортежей, но мой вопрос был немного более простым. Я нашел ответ, похороненный в documentation, поэтому я добавляю свой ответ ниже в формате Q & A для более быстрого поиска в будущем.
Ответы
Ответ 1
В соответствии с documentation (прокрутите вниз до Tuples), есть три способа сделать это.
Учитывая
var answer: (number: Int, good: Bool) = (100, true)
Метод 1
Поместите имя переменной элемента в кортеж.
let (firstElement, _) = answer
let (_, secondElement) = answer
или
let (firstElement, secondElement) = answer
Метод 2
Используйте индекс.
let firstElement = answer.0
let secondElement = answer.1
Метод 3
Используйте имена. Это работает, конечно, только если элементы были названы в декларации Tuple.
let firstElement = answer.number
let secondElement = answer.good
Ответ 2
Я пробовал это. Это не очень хорошо, но работает...
protocol SubscriptTuple {
associatedtype Tuple
associatedtype Return
var value: Tuple { get set }
subscript(sub: String) -> Return? { get }
}
struct TupleContainer: SubscriptTuple {
typealias Tuple = (number: Int, good: Bool)
typealias Return = Any
var value: Tuple
subscript(sub: String) -> Return? {
switch sub {
case "number":
return value.number
case "good":
return value.good
default:
return nil
}
}
}
И вот как это сделать.
let answer = Answer(value: (120, false))
answer["number"]