NSCoding에는 init(coder:)
이 필요하지만이 방법의 선택적 버전이 init?(coder:)
입니다.init의 선택도 (코더 :) 대 init (코더 :). nil 일 경우 어떻게해야합니까?
nil
을 반환하면 정확히 무엇을해야합니까? 이것도 문제입니까?
init(coder:)
으로 개체의 큰 계층을 초기화하고 각 개체의 자식 개체 자체를 init?(coder:)
을 사용하여 초기화한다고 가정 해보십시오. 어딘가에있는 객체 중 하나가 nil
인 경우 앱이 다운되지 않습니까? 부모 개체가 무아을 기대하지 않습니다.
"초기화하지 않으려면"무엇을 의미합니까?
class Parent: NSCoding {
var children: [Child]
required init?(coder aDecoder: NSCoder) {
guard let children = aDecoder.decodeObject(forKey: "children") as? [Child] else { return nil }
self.children = children
}
}
class Child: NSCoding {
var name: String
required init?(coder aDecoder: NSCoder) {
guard let name = aDecoder.decodeObject(forKey: "name") as? String else { return nil }
self.name = name
}
}
한 가지 전략은 단순히 단순히 nil
을 반환하지 않고 새 인스턴스를 반환하는 것입니다. 데이터가 손실되지만 앱이 실행됩니다.
(그러나 예상은 1 개 요소 배열입니다) nil'. 이 경우에는 '가드'가 필요하지 않습니다. – vadian
만약 그것이 nil이 아니어야한다면'self.name = aDecoder.decodeObject (forKey : "name")처럼! 문자열'. 충돌을 일으키지 않으려면 기본값 인'self.name = aDecoder.decodeObject (forKey : "name")를 기본값으로 초기화하는 것이 좋습니다. 문자열 ?? "". – xiangxin