【问题标题】:Calling classForCoder in init before super.init在 super.init 之前在 init 中调用 classForCoder
【发布时间】:2014-10-20 09:42:12
【问题描述】:

在我用 Swift 编写的 iOS 应用中,我有一个 Error 类,它从 NSError 扩展而来。

class MyError: NSError {

    class var ErrorDomain: String { return "com.domain.app.error" }
    class var ErrorCode: Int { return 0 }

    init(data: [String: AnyObject]) {
        let userInfo: [String: AnyObject] = [
            "data": data
        ]
        super.init(
            domain: self.classForCoder.ErrorDomain,
            code: self.classForCoder.ErrorCode,
            userInfo: userInfo
        )
    }

    [...]

}

我还有其他从上述错误类扩展而来的错误类:

class MyError2: MyError {

    override class var ErrorDomain: String { return "com.domain.app.error2" }
    override class var ErrorCode: Int { return 0 }

    [...]

}

这样我就可以使用 MyError 类中的 init,并为子类错误对象拥有自定义域和代码。

它在 Xcode 6.0.1 上运行良好。问题是,它不会在 Xcode 6.1 中编译。我在行中的MyError 类中收到此编译器错误:

[...]
domain: self.classForCoder.ErrorDomain,
code: self.classForCoder.ErrorCode,
[...]

在 super.init 初始化之前在基础对象中使用属性 'classForCoder'

是否可以在调用super.init 之前在init 中获取Class 对象?我知道这听起来很奇怪,但我认为我的示例说明了我为什么需要它。

【问题讨论】:

    标签: ios swift initialization xcode6.1-gm-seed


    【解决方案1】:

    您必须在调用super.init() 之前初始化所有实例属性。

    但是由于您传递的是类型属性的值,因此您可以简单地编写

    super.init(
            domain: MyError.ErrorDomain,
            code: MyError.ErrorCode,
            userInfo: userInfo
        )
    

    【讨论】:

    • 这显然行得通。不幸的是,当在 MyError2 上调用 init 时,新对象将具有来自 MyError 而不是 MyError2 类的域和代码。我说的对吗?
    • 是的,你完全正确。抱歉,还没想过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 2015-09-01
    相关资源
    最近更新 更多