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"]