参见英文答案 Swift language NSClassFromString24个 假设我有三个类: import Foundationclass A { init() { print("A") }}class B { init() { print("B") }}class C { init() { print("C") }} 我想以传递方式将字符串(“A”,“
假设我有三个类:
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