【问题标题】:Swift: object instance by NameSwift:按名称的对象实例
【发布时间】:2015-07-18 15:37:49
【问题描述】:

我喜欢通过类名来创建一个类的实例

这里是来自游乐场的示例代码

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

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

【问题讨论】:

  • 有点跑题了,但请(如果您还没有)提交雷达文件 - 编译器不会崩溃!
  • 是的,我已经创建了一个错误条目 (20701151)

标签: swift


【解决方案1】:

问题似乎在 Swift 2.0 中得到解决(在 Xcode 的 Beta 2 中测试)

以下调用传递一个实例:

let obj = objClass.init(coder: testCoder)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-03
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多