swift – 基于函数参数创建类的实例

参见英文答案 >
Swift language NSClassFromString                                    24个

假设我有三个类:

import Foundation

class A {

    init() {
      print("A")
    }

}

class B {

    init() {
        print("B")
    }

}

class C {

    init() {
       print("C")
    }
}

我想以传递方式将字符串(“A”,“B”或“C”)作为函数参数传递,然后在此函数的主体内部创建我传递的类的实例.这可能吗?怎么样?

我试过这个(和其他变种),但没有运气:

func test(c:AnyObject){
    let _class = c()
    //...
}

test(c:A)

[更新]也许这个问题与@Code不同的问题没有什么不同但是这个问题已经过时了,语言中有太多的变化,人们应该尝试任何建议的解决方案,然后再找到今天有效的解决方案.

最佳答案 什么可行的是有一个基类,我们称之为BaseClass.需要使用的类将从BaseClass继承.

然后,在您的函数中,您将传递所需的类型.

这是一个演示此技术的代码片段:

class BaseClass { }

class A: BaseClass { ... }
class B: BaseClass { ... }
class C: BaseClass { ... }

func test(type: BaseClass.Type) {
    let someObject = type.init()
    // You can cast the object if required
}

test(type: A.self) // creates an object of class A
test(type: B.self) // creates an object of class B

编辑:如果你真的需要一个字符串来转换你的类型,你可能会考虑在调用test之前做一些工作.获取开关盒中的类型然后将其传递给测试应该这样做.

编辑:它也适用于协议,只要它定义了您需要的初始化程序,以及必须公开的每个函数:

protocol SomeProtocol: class {
    init()
    func someFunction()
}

class A {
    required init() {
        print("A")
    }
}

extension A: SomeProtocol {
    func someFunction() {
        print("Some function of A")
    }
}

class B {
    required init() {
        print("B")
    }
}

extension B: SomeProtocol {
    func someFunction() {
        print("Some function of B")
    }
}

class C {
    required init() {
        print("C")
    }
}

extension C: SomeProtocol {
    func someFunction() {
        print("Some function of C")
    }
}

func test(someType: SomeProtocol.Type) {
    let someObject: SomeProtocol = someType.init()
    someObject.someFunction()
}

test(someType: A.self) // creates an object of class A
test(someType: B.self) // creates an object of class B
点赞