【问题标题】:Swift throw run time error when using generic class使用泛型类时 Swift 抛出运行时错误
【发布时间】:2015-08-19 05:38:09
【问题描述】:

似乎 swift 在处理泛型类时存在一些问题。似乎这些代码可以编译,但遇到println(act.actId) 时会出现运行时错误。它抛出了一个EXC_BAD_ACCESS 错误。

对于这个问题还有其他方法或解决方法吗?

public class Item {
    public var id: String
    public init(str: String) {
        id = str
    }
}

public class Account: Item {
    public var actId: String
    public override init(str: String) {
        actId = "antId: \(str)"
        super.init(str: str)
    }
}

public class Keyword: Item {
    public var keywordId: String
    public override init(str: String) {
        keywordId = "keywordId: \(str)"
        super.init(str: str)
    }

}

public class Creator<T: Item> {
    public func parse(str: String) -> T {
        var result: T = T(str: str)
        return result
    }
}

var a = Creator<Account>()
var act = a.parse("Apple")
println(act.actId)

【问题讨论】:

    标签: swift generics design-patterns


    【解决方案1】:

    在我的情况下,这不能在操场上编译。

    默认情况下子类不继承其超类初始化器 -> Apple

    您需要将init() 标记为required

    我已经更改了它,现在可以使用了

    public class Item {
        public var id: String
        public required init(str: String) {
            id = str
        }
    }
    
    public class Account: Item {
        public var actId: String
        public required init(str: String) {
            actId = "antId: \(str)"
            super.init(str: str)
        }
    }
    
    public class Keyword: Item {
        public var keywordId: String
        public required init(str: String) {
            keywordId = "keywordId: \(str)"
            super.init(str: str)
        }
    
    }
    
    public class Creator<T: Item> {
        public func parse(str: String) -> T {
            let result: T = T(str: str)
            return result
        }
    }
    
    var a = Creator<Account>()
    var act = a.parse("Apple")
    print(act.actId)
    

    详情请见similar question

    【讨论】:

      猜你喜欢
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 2019-06-03
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      相关资源
      最近更新 更多