【问题标题】:How to pass a Swift type as a method argument?如何将 Swift 类型作为方法参数传递?
【发布时间】:2016-09-12 11:01:14
【问题描述】:

我想做这样的事情:

func doSomething(a: AnyObject, myType: ????)
{
   if let a = a as? myType
   {
       //…
   }
}

在 Objective-C 中,class 的类是Class

【问题讨论】:

  • 你会想要使用泛型和T.Type 类型的方法输入,然后你可以转换为T - 参见例如this Q&A

标签: types parameters swift2


【解决方案1】:

您必须使用一个泛型函数,其中参数仅用于类型信息,因此您将其转换为T

func doSomething<T>(_ a: Any, myType: T.Type) {
    if let a = a as? T {
        //…
    }
}

// usage
doSomething("Hello World", myType: String.self)

使用T类型的初始化器

您通常不知道T 的签名,因为T 可以是任何类型。所以你必须在协议中指定签名。

例如:

protocol IntInitializable {
    init(value: Int)
}

使用此协议,您可以编写

func numberFactory<T: IntInitializable>(value: Int, numberType: T.Type) -> T {
    return T.init(value: value)
}

// usage
numberFactory(value: 4, numberType: MyNumber.self)

【讨论】:

  • 如何调用构造函数?
  • @Augusto 请查看我的更新答案。我希望这会有所帮助。
  • 让我解释一下我的问题:我有一个包含一些表的数据库,对于每个表我都有一个类(对于每个对象,如产品、人员、客户......)我想创建一个通用函数从数据库中读取所有记录,因为我想使用 T(类型类)来创建这些对象的列表。我不知道如何设置类型类来创建新对象。我的构造函数接收到参数等属性的字典。
  • @Augusto 我认为“Rob”在你的问题stackoverflow.com/q/49577256/4780031 中完美地回答了它,这几乎是我的例子。
猜你喜欢
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
  • 2015-01-22
相关资源
最近更新 更多