2014-10-20 41 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

相關問題