자체 제작 클래스의 Attribute를 CoreData로 저장하는 방법
개요
코어 Data noob인 만큼 트랜스포머를 사용해 애트리버트를 저장하려는 타입 중 표준적으로 준비된 타입이 없을 때는 당황스러우므로 메모로 남겨뒀다.
아마 정답의 흐름으로
네.다음은 상세히 서술한다.
Swift 버전은 4.1입니다.
자제류의 정의
User.swift
class User: NSManagedObject {
@NSManaged var name: String
@NSManaged var pet: Pet
}
class Pet {
var name: String?
var gender: Gender?
}
enum Gender: Int {
case male = 0
case female
}
상술한 것은 이번 처리의 데이터 모델이다.User에는 이름과 키우는 반려동물이 있고, Pet에는 이름과 성별이 있다.User 클래스를 CoreData의 Enity로 처리하기 위해 NSManagedObject가 상속하도록 속성@NSManaged
이 첨부되어 있습니다.이 글의 목적은 펫 속성을 Attribute로 저장하는 것입니다.
그럼 위에 코드를 이렇게 쓰면 "pet 속성은 사용할 수 없습니다
@NSManaged
!"이러다 혼나.보아하니 반드시 Obj-C가 표현할 수 있는 반이어야 한다.따라서 Pet 레벨이 NSObject를 상속하도록 합니다.User.swift
...
class Pet: NSObject {
var name: String?
var gender: Gender?
}
...
이렇게 하면 욕을 먹지 않겠지만 코어데이터로 처리할 수는 없다.NSCoding 준수
그런 다음 Pet 클래스가 NSCoding과 일치하도록 코딩 및 디코딩 프로세스를 구현합니다.
User.swift
...
class Pet: NSObject, NSCoding {
var name: String?
var gender: Gender?
func encode(with aCoder: NSCoder) {
aCoder.encode(self.name, forKey: "Name")
aCoder.encode(self.gender!.rawValue, forKey: "Gender")
}
required init?(coder aDecoder: NSCoder) {
super.init()
self.name = aDecoder.decodeObject(forKey: "Name") as? String
let genderValue = aDecoder.decodeInteger(forKey: "Gender")
self.gender = Gender(rawValue: genderValue)
}
}
...
이렇게 하면 코어데이터로 펫 레벨을 처리할 수 있습니다!여기서 주의해야 할 것은 엔움도 그렇게 저장할 수 없기 때문에 먼저 rawValue를 통해 인코딩/해독을 해야 한다는 것이다.당연하다고...
Transformable로 설정
마지막으로 Attribute의 Type을 Transformable로 변경하면 완성됩니다.
상관없어, "Attribute의 Type을 Transformable로 만들어라"는 글은 엉망이야.큰일났다...(어휘력 0)
Reference
이 문제에 관하여(자체 제작 클래스의 Attribute를 CoreData로 저장하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/0nji/items/3788936e25cc018ca1ac텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)