从Reference而不是String实例化类

时间:2014-09-28 00:04:46

标签: objective-c swift

让我们假设我是一个班级

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
        }

    }
}

1 个答案:

答案 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的函数中,因为一些没有函数的简单示例当前会导致编译器崩溃。但是大多数时候你想将它传递给函数。)

有关此问题的更多讨论来自其他方向: