Swift:Name的对象实例

时间:2015-05-07 21:06:55

标签: swift

我喜欢用类的名称

创建一个类的实例

这里是游乐场的示例代码

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

基本的区别在于我们在这里谈论一个纯Swift类(而不是NSObject子类),它默认没有init方法。

1 个答案:

答案 0 :(得分:0)

这个问题在Swift 2.0中得到了解决(在Xcode的Beta 2中测试过)

以下调用提供了一个实例:

let obj = objClass.init(coder: testCoder)