我一直在 Swift 中探索不同的抽象,我发现自己被如何从元组元素本身的类型确定其类型所困扰。我知道编译器和 Xcode 很快就会向我(编码器)提供此类信息,并且我知道如何在元组变量或常量的元素上使用
type(of:)
,但我似乎无法弄清楚如何从代码中执行此操作仅使用元组类型。
这是我使用不完整代码的问题:
// Somewhere else in the code...
typealias NamedTuple = (/*someunknowntype*/, /*someotherunknowntype*/)
// Later in the code...
let tupleType = NamedTuple.self // repetitive, I know... but I know how to get its own type
let tupleElement0Type = // <-- How do I get this from the NamedTuple alias?
我似乎找不到任何文档提到从元组的类型名称或文字格式访问元组元素的方法,尽管后者很愚蠢。
我已经知道如何使用通用解决方案来解决这些问题。我只是在寻找直接的东西,比如在类型名称或别名上使用
.self
。
我已经可以获取数组(
ArrayType.Element.type
)和字典(Dictionary.Key.self
和Dictionary.Value.self
)的元素类型,但这些显然是通过它们的typealias
属性获得的。
有谁知道如何直接从类型的名称或别名输入类型的元素? 或者,至少来自数组或字典以外的集合类型?
对于没有标签的元组,可以通过参数包来实现:
func tupleTypes<each T>(_: (repeat (each T)).Type) -> (repeat (each T).Type) {
((repeat (each T).self))
}
typealias MyTuple = (Int, String, [Double])
print(tupleTypes(MyTuple.self))
// (Swift.Int, Swift.String, Swift.Array<Swift.Double>)
let types = tupleTypes(MyTuple.self)
print(types.0)
// Int