Swift 基于函数参数创建类的实例

Swift 基于函数参数创建类的实例,swift,function,class,instantiation,Swift,Function,Class,Instantiation,假设我有三个班: import Foundation class A { init() { print("A") } } class B { init() { print("B") } } class C { init() { print("C") } } 我想以友好的方式传递一个字符串(“a”、“B”或“C”)作为函数参数,然后在这个函数体中创建我传递的类的实例。这可能吗?怎么做 我尝试

假设我有三个班:

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 different建议的问题没有什么不同,但这个问题很老,而且语言中有太多的变化,因此在找到一个至今仍然有效的解决方案之前,我们应该尝试任何建议的解决方案

可行的方法是拥有一个基类,让我们称之为基类。需要使用的类将继承自
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
<> > >编辑:如果你真的需要一个字符串来转换你的类型,你可以考虑在调用<代码>测试< /COD>之前做一些工作。在开关盒中获取类型,然后将其传递给
测试

编辑:它还可以与协议一起使用,只要它定义了您需要的初始值设定项,以及必须公开的每个函数:

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

该协议不起作用,而只要添加所需的init,基类就起作用。我不能编辑你的代码,但我想这个let someObject type.init()应该是let someObject=type.init()@3000添加了一个与协议一起工作的版本,在操场上测试过。协议需要定义类所使用的初始值设定项。它工作得很好,但我发现,如果向每个类添加一个方法,则必须将其添加到协议中too@3000诚然,最好通过添加外部所需的每个API来定义您的协议。否则,您必须强制转换对象以了解其具有的特定函数(那些不在协议中的函数)。我添加了一些改变,展示了一种方法。