2014-10-28 50 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