Swift:按名称的对象实例

标签 swift

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

这里是 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/

相关文章:

swift - 如何仅选择带有按钮的点击单元格?

arrays - 类数组错误 - '' 表达式类型不明确,没有更多上下文”

ios - Swift Core蓝牙 : Should CentralManager run in a separate thread?

ios - UICollectionView 状态恢复 : restore all UICollectionViewCells

ios - Callkit 可以与非 voip 调用一起使用以获取 ios 中的调用状态吗?

ios - 将 CoreData 键传递给新的 ViewController

ios - CocoaLumberjack Undefined Symbols 为模拟器构建

ios - 从外部函数 Swift 访问常量

ALAMOFIRE 的 JSON_encode

swift - 更新到 Xcode 8 beta 6 后,关联枚举中丢失了 CKErrorCode 和 .rawValue