我喜欢通过类的名字来创建一个类的实例
这里是 Playground 的示例代码
import Cocoa
public protocol FCoding : class {
init(coder aDecoder: FCoder)
func encodeWithCoder(aCoder: FCoder)
}
// just some func for demo
public protocol FCoder {
func encodeString(strv: String?, forKey key: String)
func decodeStringForKey(key: String) -> String?
}
class TestCoder : FCoder {
var name = "TestCoder"
init () {}
func encodeString(strv: String?, forKey key: String) {}
func decodeStringForKey(key: String) -> String? {
return "111"
}
}
class Test : FCoding {
var text : String
required init(coder aDecoder: FCoder) {
var value = aDecoder.decodeStringForKey("1")
if value != nil {
text = value!
} else {
text = "!!!"
}
}
func encodeWithCoder(aEncoder: FCoder) {
aEncoder.encodeString(text, forKey: "1")
}
}
var testCoder = TestCoder()
let className = NSStringFromClass(Test)
let objClass = NSClassFromString(className) as! FCoding.Type
//let obj = objClass(coder: testCoder)
如果我取消注释最后一条语句,编译器会崩溃并出现段错误:11(在 XCode 版本 6.3.1 (6D1002) 中)
- 有没有其他方法可以实现这一点?
- 代码中是否存在错误?
- 你有同样的问题吗?
这里有一个关于类似主题的讨论: Swift language NSClassFromString
本质区别在于我们在这里讨论的是默认情况下没有 init 方法的 pur Swift 类(而不是 NSObject 子类)。
最佳答案
问题似乎已在 Swift 2.0 中修复(在 Xcode 的 Beta 2 中测试)
以下调用传递一个实例:
let obj = objClass.init(coder: testCoder)
关于Swift:按名称的对象实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30111659/