你基本上有三个选择:
- 将变量声明为隐式展开的选项
- 让
init?(coder:) 失败,无论是否致命
- 让
CPCoursePoint 和CPEventData 通过init?(coder:) 实现取消归档
选项 1:
class CPCoursePointLayer : CAShapeLayer
{
let itsDataRef :CPCoursePoint!
let itsEventData :CPEventData!
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
init( coursePoint: CPCoursePoint, in eventData :CPEventData)
{
itsDataRef = coursePoint
itsEventData = eventData
}
}
如果您引用 itsDataRef 或 itsEventData 并且您的对象没有被新的初始化程序初始化,这将导致崩溃。
选项 2(a)
class CPCoursePointLayer : CAShapeLayer
{
let itsDataRef :CPCoursePoint
let itsEventData :CPEventData
required init?(coder aDecoder: NSCoder) {
return nil
}
init( coursePoint: CPCoursePoint, in eventData :CPEventData)
{
itsDataRef = coursePoint
itsEventData = eventData
}
}
如果使用init(coder:),这将无法初始化对象。
选项 2(b)
class CPCoursePointLayer : CAShapeLayer
{
let itsDataRef :CPCoursePoint
let itsEventData :CPEventData
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) is not supported for this class"
}
init( coursePoint: CPCoursePoint, in eventData :CPEventData)
{
itsDataRef = coursePoint
itsEventData = eventData
}
}
如果调用init(coder:),这将导致您的程序崩溃。
选项 3
class CPCoursePointLayer : CAShapeLayer
{
let itsDataRef :CPCoursePoint
let itsEventData :CPEventData
required init?(coder aDecoder: NSCoder) {
guard let itsDataRef = aDecoder.decodeObject(forKey:"itsDataRef"),
let itsEventData = aDecoder.decodeObject(forKey:"itsEventData") else {
return nil
}
self.itsDataRef = itsDataRef
self.itsEventData = itsEventData
super.init(coder: aDecoder)
}
init( coursePoint: CPCoursePoint, in eventData :CPEventData)
{
itsDataRef = coursePoint
itsEventData = eventData
}
}
选项 2(b) 可能是最常见的,因为它是“快速失败” - 如果调用了该初始化程序,您应该在测试期间很快发现这一点。