【问题标题】:Generic type parameter as variable泛型类型参数作为变量
【发布时间】:2019-08-06 08:56:15
【问题描述】:

有没有办法将类型参数动态传递给通用 swift 类?下面只是出于说明的目的,来自给出错误的操场:使用未声明的类型“按钮”

import Cocoa

class PrintNameOfClass<T: NSObject> {
    func printType() {
        print(type(of: T.self))
    }
}

let button = NSButton()
let test = PrintNameOfClass<button>()
test.printType()

【问题讨论】:

  • 试试 button.self
  • 如果我更改为 button.self,我会收到以下两个错误:相邻运算符位于非关联优先级组“ComparisonPrecedence”中,并且二进制运算符“.Type' 和 'NSButton'。

标签: swift generics parameters


【解决方案1】:

在这种情况下,使函数通用而不是类能够传递 instance button

更合理
class PrintNameOfClass {
    func printNameOfClass<T : NSObject>(of : T) {
        print(type(of: T.self))
    }
}

let button = NSButton()
let test = PrintNameOfClass()
test.printNameOfClass(of: button)

【讨论】:

  • 行得通!仍然在查看上述示例中是否有与实际代码一样的方法,许多已经存在的方法实际上利用了类的泛型类型参数。
  • 示例中的通用参数必须是 literal 类型,例如 PrintNameOfClass&lt;NSButton&gt;(),因为它是在编译时评估的。不能是动态类型,如button.self
  • 是的,文字类型绝对有效——我的问题是是否有办法使用动态类型,可能以不同的方式使用。
  • @Daniel 不,这行不通,因为所有类型都必须在编译时已知,因此您不能在运行时使用类型来专门化泛型类型
猜你喜欢
  • 2021-06-17
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
相关资源
最近更新 更多