让我们假设我是一个班级
class Test {
}
然后在程序的另一部分我可以做
let testClass = NSClassFromString( "Test" ) as NSObject.Type
let testInstance = testClass()
有没有办法从Test本身的引用做同样的事情,传递Test作为参考,然后从引用创建一个对象
通过引用我的意思是传递Test
本身并且接收部分代码将能够从中创建对象。
就像我们以前在Objective-C中所做的那样
TestClassRef = [Test class]
[[TestClassRef alloc] init]
编辑:
protocol ISomeProtocol {
func action ()
func init()
}
class Test
var classesMap = Dictionary<String,ISomeProtocol>()
func init () {
self.classesMap = Dictionary<String,ISomeProtocol>()
}
func myAction (name:String ) {
var myClass:ISomeProtocol;
if let myClass = self.classesMap[ name ] {
var myInstance = myClass() as ISomeProtocol
myInstance.action()
} else {
return
}
}
}
答案 0 :(得分:0)
是的,但你需要对这门课做出一些承诺。例如,objC代码的等价物如下:
let testClass: AnyClass = Test.self
let test = testClass()
由于Swift无法知道AnyClass
有可用init()
,因此无法编译。你需要承诺它可以简单地构建:
protocol Trivial {
init()
}
这意味着你的班级必须遵守:
final class Test: Trivial {
required init() {}
}
然后你可以自由地传递并使用对该类的引用:
func make<T: Trivial>(type: T.Type) -> T {
return type()
}
let myType = Test.self
let something = make(myType)
(我将它包装到一个名为make
的函数中,因为一些没有函数的简单示例当前会导致编译器崩溃。但是大多数时候你想将它传递给函数。)
有关此问题的更多讨论来自其他方向: