У вас есть три варианта:
- Объявление переменных как неявно развернутых опций
- У
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 (а)
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 (б)
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), вероятно, является наиболее распространенным, так как это "быстрый отказ" - вы должны уловить это во время тестирования довольно быстро, если вызывается этот инициализатор.