2014-10-28 63 views
2

我遇到問題實施子類NSView實現NSCodingFailable和非failable初始化器阻止我擴展NSView和實現NSCoding

看來init(coder: NSCoder)的聲明在NSViewNSCoding中是衝突的。 NSView時下說它是失敗的,但NSCoding仍然說它不失敗。

當我嘗試重寫init(coder: NSCoder),做我的自定義初始化時,Xcode 6.1給我一個錯誤信息:

非failable初始化無法鏈failable初始化 「的init(編碼器:)」寫有'在裏面?'

我該怎麼做我的班級的自定義初始化?

這裏是一個愚蠢的例子,我擴展了一個視圖,我想爲我的視圖保留一個額外的點擊計數器。

import Cocoa 
import Foundation 

class MyView: NSView, NSCoding { 

    var clickCounter:Int = 0 

    required init(coder: NSCoder) { 
     super.init(coder: coder) 
     coder.encodeObject(self.clickCounter, 
       forKey: "clickCounter") 
    } 

    override func encodeWithCoder(coder: NSCoder) { 
     super.encodeWithCoder(coder) 
     coder.encodeObject(self.clickCounter, forKey: "clickCounter") 
    } 

    override func mouseDown(theEvent: NSEvent) { 
     clickCounter++ 
    }  
} 

enter image description here

回答

11

您不必明確符合NSCoding,因爲NSResponder(的NSView超)已經符合了。

required init?(coder: NSCoder) { 
    super.init(coder: coder) 
    self.clickCounter = coder.decodeObjectForKey("clickCounter") as Int 
} 
+0

滿足編譯器,但它似乎很奇怪(我):'NSCoding'需要'的init(編碼器aDecoder:NSCoder)',即非failable初始化,但'NSResponder','NSView'等實現'init?(coder:NSCoder)'。 - 可能是導入頭文件中的錯誤? – 2014-10-28 10:54:44

+0

是的,我認爲是的。 : -/ – rintaro 2014-10-28 10:55:19

+0

謝謝!所以總結解決方案,我刪除了明確符合NSCoding並添加了一個?到我的初步使它failable。仍然奇怪,我想知道NSResponder是如何設法在NSFoding的可疑初始化過程中實現所需的無法初始化的init。還是我錯過了明顯的東西? – Hunkpapa 2014-10-28 13:23:38