【发布时间】:2020-04-21 14:54:03
【问题描述】:
我得到的错误并不奇怪,但是我如何在 Swift 中完成这样的事情呢?
let stringType = String.self
let stringArrayType = Array<String>.self
let stringArrayTypeFromVariable = Array<stringType>.self // Error :Use of undeclared type 'stringType'
我的最终目标是构建这样的函数。
print( getTypeAsArray( Int.self ) ) // prints "Array<Int>.Type"
print( getTypeAsArray( String.self ) ) // prints "Array<String>.Type"
这是我目前的尝试。它不能编译,但我认为这可以用这样的泛型解决。
// this version doesn't compile...
func getTypeAsArray<T>(_ value: T) -> [T].Type {
return []
}
getTypeAsArray(String.self)
// this version compiles, but doesn't give me the functionality I want...The expected output was Array<String>, not Array<String.Type>
func getTypeAsArray<T>(_ value: T) -> [T].Type {
return type(of: [])
}
getTypeAsArray(String.self) // -> Array<String.Type>
【问题讨论】:
-
你的最终目标似乎毫无意义。是否有final 最终目标?您是否要将编译时未知的类型传入
getTypeAsArray? -
好吧,我不认为这是可能的。函数签名会是什么样子?它会接受
Any.Type参数,对吧?它会返回什么类型? -
泛型在编译时绑定。如果您在编译时不知道类型,泛型将无济于事。继续我前面的论点,该方法需要接受
Any.Type类型的参数t。这样在运行时,t可以存储任何元类型对象。但是该方法会返回什么?它不能返回[Any].Type,因为元类型不是协变的。 -
我明白你的意思。没有办法让它返回 [T].Type 并动态确定 T,因为 T 必须在编译时确定
-
我看到您甚至还在为
getTypeAsArray的“仅编译时”版本而苦苦挣扎。你的意思可能是func getTypeAsArray<T>(_ value: T.Type) -> [T].Type { return [T].self }。
标签: arrays swift generics types casting