Это действительно возможно, если вы готовы сделать обертку вокруг вашего кортежа. Это, как говорится, ужасно, никогда не делайте этого. Предложения, сделанные в других ответах, практически намного лучше, но для целей образования , вот мой пример.
struct TupleWrapper {
let tuple: (String, Int, String, String, String, String, String, Bool)
let count: Int
private let mirrors: [MirrorType]
subscript (index: Int) -> Any {
return mirrors[index].value
}
init(tuple: (String, Int, String, String, String, String, String, Bool)) {
self.tuple = tuple
var mirrors = [MirrorType]()
let reflected = reflect(tuple)
for i in 0..<reflected.count {
mirrors.append(reflected[i].1)
}
self.mirrors = mirrors
self.count = mirrors.count
}
}
let wrapper = TupleWrapper(tuple: ("1", 2, "3", "4", "5", "6", "7", false))
wrapper[0] // "1"
wrapper[wrapper.count - 1] // false
Код выше использует API для отражения Свифта, чтобы получить логические ребенок вашего объекта кортежа и добавить свои зеркала в массив, на котором мы можем индекс для значения каждого зеркала. Это довольно прямолинейно, но, как и следовало ожидать, поскольку мы работаем с кортежами, это никоим образом не может быть динамическим. Обертка должна быть создана для определенного типа кортежа.
Для некоторых связанных чтений см. Недавнюю статью NSHipster MirrorType.
Как @ Бен-G сказал, что вы хотите сделать, это невозможно, следует использовать массив вместо. – Arbitur
Как это работает? Тип элемента кортежа зависит от индекса, который должен быть известен во время компиляции. – Clashsoft