스위프트 4에서 코드 가능을 사용하여 코드를 업그레이드하고 줄이려고하면 클래스/참조 유형 동작과이 동작이 어떻게 관련되는지 이해하기가 쉽지 않습니다.참조 유형/서브 클래 싱 및 변경 사항 Swift 4 코드 가능 및 인코더/디코더
저는 두 가지 클래스가 있습니다 - 모든 데이터가 저장되는 SuperClass와 UserDefaults (장소 이름은 좌표가있는 & 문자열)에 저장되며, 필요하지 않은 추가 임시 정보가 포함 된 SubClass (SuperClass 좌표의 날씨 데이터).
는 스위프트 (3)에서이 같은 데이터를 저장하는데 사용 :func saveUserDefaults() {
var superClassArray = [SuperClass]()
// subClassArray is of type [SubClass] and contains more data per element.
superClassArray = subClassArray
let superClassData = NSKeyedArchiver.archivedData(withRootObject: superClassArray)
UserDefaults.standard.set(superClassData, forKey: " superClassData")
}
슈퍼 또한 필요한 초기화 디코더 & 인 코드 기능을 포함 NSObject의 & NSCoding 을 따른다. 모두 정상적으로 작동했습니다.
스위프트 4로 바꾸려고 시도 할 때 & 코드 가능 코드를 적용하기 위해 SuperClass를 수정했습니다. SuperClass에는 이제 기본 이니셜 라이저가 하나만 있으며 Swift 3의 엔코더/디코더는 없습니다.이 새로운 접근 방식에서는 KeyedArchiving이 발생하지 않습니다 (아래). 하위 클래스는 변경되지 않습니다. 불행히도 내가 시도하는 라인에서 충돌이 발생합니까? encoder.encode [스레드 1에게 : EXC_BAD_ACCESS (코드 = 1, 주소 = 0x10)]. 내 가정은 하나의 SuperClass 및 하나의 SubClass (subClassArray [0] === superClassArray [0]이 참인)와 동일한 참조 유형으로 인코더가 혼동되고 있다는 것입니다.
func saveUserDefaults() {
var superClassArray = [SuperClass]()
superClassArray = subClassArray
// assumption was that the subclass would only contain parts of the superclass & wouldn't produce an error when being encoded
let encoder = JSONEncoder()
if let encoded = try? encoder.encode(superClassArray){
UserDefaults.standard.set(encoded, forKey: " superClassArray ")
} else {
print("Save didn't work!")
}
}
을 그리고, 대신 다음, 빈 superClassArray를 작성, 사용의 :
let superClassArray: [SuperClass] = subClassArray.map{SuperClass(name: $0.name, coordinates: $0.coordinates)}
: 위의 그림과 같이 이 superClassArray = subClassArray, 나는 한 줄이 교체 나는이 작업을 거라고 생각 이 작동합니다. 다시 말하지만, 클래스 참조 유형 & 내부의 값을 전달하고 있기 때문에 가정은 superClassArray = subClassArray를 만들지 않았기 때문입니다. 또한, 예상대로, subClassArray [0] === superClassArray [0]은 거짓입니다.
Swipe 3에서 "old stuff"는 왜 사용 했습니까? 전에 superClassArray = subClassArray 줄을 사용했는데 왜 그렇게 했습니까? superClassData = NSKeyedArchiver .archivedData (withRootObject : superClassArray) ? 이전 Swift 3 인코더/디코더에서 발생했던 Swift 4에서 어레이를 생성하여 동일한 결과를 얻었습니까? 루핑/레크리에이션입니다
고마워요!
'JSONEncoder'에 의해 던져진 오류를 잡아서 출력하십시오. 인코딩이 실패하는 이유를 더 잘 이해할 수 있습니다. 또한 클래스의 정의 (또는 문제를 설명하는 단순화 된 버전)를 포함 할 수 있다면 누군가가 당신을 도울 가능성이 더 큽니다! – idz