프로그래밍/iOS

NSCoding 쓸 때 does not implement methodSignatureForSelector: 에러가 나는 경우

turu 2021. 9. 17. 01:15

해결방법

1. 인코딩할 클래스가 NSObject를 상속했는지 확인. 이때 CustomStringConvertible 프로토콜을 사용할 수 없게 됨

2. 클래스의 프로퍼티로 enum을 가지고 있으면 안된다.

(enum 타입을 가지고 있다면 원시형 값으로 치환해서 하던가 해야함)

//
//  Player.swift
//  MultiSceneWithUserDefaultTest
//
//  Created by turu on 2021/09/17.
//

import Foundation



class Player: NSObject, NSCoding {
    enum Gender: String {
        case man
        case woman
        case other
    }
    
    func descriptionToPrint() -> String {
        return "\(name), \(gender), \(age)"
    }

    var name: String
    var age: Int
    var gender: String
    
    init(name: String, age: Int, gender: Gender) {
        self.name = name
        self.age = age
        self.gender = gender.rawValue
    }
    
    func encode(with aCoder: NSCoder) {
        print(#function, #line)
        aCoder.encode(name, forKey: "name")
        aCoder.encode(age, forKey: "age")
        aCoder.encode(gender, forKey: "gender")
    }
    
    required init?(coder aDecoder: NSCoder) {
        print(#function, #line)
        name = aDecoder.decodeObject(forKey: "name") as! String
        age = aDecoder.decodeInteger(forKey: "age")
        gender = aDecoder.decodeObject(forKey: "gender") as! String
    }
    
}

예시) Player는 생성 할 때는 Gender 타입으로 받지만  gender 프로퍼티를 Gender 타입으로 저장하지 않고 String타입으로 변환해서 저장하게 함

 

반응형