2014-10-20 17 views
0

在我用Swift编写的iOS应用程序中,我有一个Error类,它从NSError扩展而来。在super.init中调用init中的classForCoder

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 } 

    [...] 

} 

这样我可以使用的init从MyError类,并具有用于子类的错误的对象的自定义域和码。

它在Xcode 6.0.1上运行良好。问题是,它不会在Xcode 6.1中编译。我得到这个编译器错误MyError班线:

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

在基本对象使用的特性“classForCoder”之前super.init初始化

是否有可能得到Class对象init在致电super.init之前?我知道这听起来很奇怪,但我认为我的例子显示了我为什么需要它。

回答

0

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

但因为你正在传递类型属性的值,你可以简单地写

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

这显然会工作。不幸的是,当init调用MyError2时,新对象将具有来自MyError而不是MyError2类的域和代码。我对吗? – Darrarski 2014-10-20 10:12:57

+0

是的,你完全正确。对不起,没想过。 – marcusficner 2014-10-20 10:22:25

相关问题