Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift:按名称列出的对象实例_Swift - Fatal编程技术网

Swift:按名称列出的对象实例

Swift:按名称列出的对象实例,swift,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 ke

我喜欢只根据类的名称创建类的实例

这里是一个游乐场的示例代码

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)中)

  • 有没有其他方法可以实现这一点
  • 代码中有错误吗
  • 你也有同样的问题吗
这里有一个关于类似主题的讨论:


本质上的区别在于,我们讨论的是默认情况下没有init方法的pur-Swift类(而不是NSObject子类)。

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

以下调用将传递一个实例:

let obj = objClass.init(coder: testCoder)

有点离题,但请(如果你还没有)提交一个雷达文件-没有任何东西会使编译器崩溃!是,我已经创建了一个bug条目(20701151)