【问题标题】:Swift type-variable to generic-type-variableSwift 类型变量到泛型类型变量
【发布时间】: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&lt;T&gt;(_ value: T.Type) -&gt; [T].Type { return [T].self }

标签: arrays swift generics types casting


【解决方案1】:

您可以通过执行以下操作来实现您的最终目标:

func getTypeAsArray<T>(_ value: T.Type) -> [T].Type { 
    return [T].self 
}

但这在这种情况下不起作用:

let t: UIView.Type = UITableView.self
print(getTypeAsArray(t))

您希望它打印Array&lt;UITableView&gt;,但它打印Array&lt;UIView&gt;

不幸的是,我认为您不能使上述情况也正常工作。因为这样的方法必须接受Any.Type,但它的返回类型是什么?它不能返回 [Any].Type,因为尽管元类型是协变的,但元类型 数组 不是:

let t: [UIView].Type = [UITableView].self

错误:无法将 [UIView].Type 类型的值转换为指定类型 [UITableView].Type

【讨论】:

  • 这对我有用,因为在我的项目中,在通过它之前我已经在向下转换了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多