【问题标题】:Swift Compiler Error: Segmentation-fault 11 thrown when using type constraintsSwift 编译器错误:使用类型约束时抛出分段错误 11
【发布时间】:2015-02-27 13:44:22
【问题描述】:

所以,我很快就会收到以下错误:

由于信号而导致命令失败:分段错误:11,在发出 IR SIL 功能时

在以下代码中通过类型约束创建类的新实例时:

public protocol AddOn {
    init()
    init(main: Main, name: String)
    func getId() -> String
    func description()
}


public class Foo : NSObject, AddOn {
    private var _main: Main?
    private var _name: String = ""
    required override public init() {

    }

    required public init(main: Main, name: String) {
        self._main = main
        self._name = name
    }

    public func getId() -> String {
        return "Foo"
    }

    public func description() {
        NSLog("Class: %@", self.getId())
    }
}

public class Main {
    private var _addons = Dictionary<String, AddOn.Type>()
    init() {

    }

    public func registerAddOn<T: AddOn>(addOnProtocol: T.Type) {
        // Here it is possible to Init the AddOn.Type to an object (e.q. Foo())
        let addOn: AddOn = addOnProtocol() as AddOn
        self._addons[addOn.getId()] = addOnProtocol
    }

    public func createInstance(addonClassName: String) {
        var getAddOnType: AddOn.Type = self._addons[addonClassName]!
        //Segmentation fault 11: While emitting IR SIL function
        let instance = getAddOnType(main: self, name: "Bar")
    }
}

var client: Main = Main()
client.registerAddOn(Foo.self)
client.createInstance("Foo")

在 registerAddOn 我可以创建类 Foo 的新实例,但不能在 createInstance

【问题讨论】:

  • 我自己解决了这个问题,我使用了除 T.Type 之外的 AnyClass。还要感谢 Mgetz,这个链接给了我一些新的灵感!我的解决方案已添加到问题中。
  • 我将解决方案移至社区 wiki 答案。

标签: swift segmentation-fault initialization protocols type-constraints


【解决方案1】:

OP 的解决方案。

private var _addons = Dictionary<String, AnyClass>()
    public func registerAddOn(addOnProtocol: AnyClass) {
        let addOnType = addOnProtocol as NSObject.Type
        let addOn: AddOn = addOnType() as AddOn
        self._addons[addOn.getId()] = addOnProtocol
    }

    public func createInstance(addonClassName: String) {
        var getAddOnType: AddOn.Type = self._addons[addonClassName]!
        let instance = getAddOnType(main: self, name: "Bar")
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多