티스토리 뷰

이전 포스팅에서는 Object에 값을 다 채워서 데이터를 저장했다.

 

모든 값이 채워지지 않은 Object를 저장하면 어떻게 될까?

nil이 포함된 저장

car.setValue(myCar["brand"], forKey: "brand")
// car.setValue(myCar["color"], forKey: "color")
car.setValue(myCar["price"], forKey: "price")

위와 같은 코드로, 일부 값을 비워서 저장해보자

value를 주지 않고 저장하면 해당 값이 nil로 들어가게 된 것을 알 수 있다.

 

Entity의 속성의 optional 유무

그럼 Entity의 속성들은 기본적으로 optional일까?

guard let newcar = try? context.fetch(Car.fetchRequest()) else { return }
newcar.forEach {
    print($0.brand, $0.color, $0.price)
    print(type(of: $0.brand))
    print(type(of: $0.color))
    print(type(of: $0.price))
}

brand와 colors는 optional로, price는 Int64로 나온다

 

그럼 이번에는 price 값을 주지 않고 저장해보자

        car.setValue(myCar["brand"], forKey: "brand")
        car.setValue(myCar["color"], forKey: "color")
//        car.setValue(myCar["price"], forKey: "price")

두둥

nil이 아니라 0이 들어가있는 것을 알 수 있다

아무런 설정을 하지 않는다면, 현재 String 속성은 optional로, Int64는 non-optional인 것을 알 수 있다

optional 설정하기

사실은 Data Model 파일에서 Entity의 Attribute를 클릭한 후, 인스펙터 창을 확인하면 optional 여부를 설정할 수 있는 부분이 있다

인스펙터 창에서는 옵셔널 여부와 Default 값도 설정해줄 수 있다

근데 Integral64는 현재 optional로 설정되어있지만 기본 값이 0으로 설정되어 있다

기본 값 삭제하고 테스트해보자(No Value)

0이 기본값으로 들어가고, 여전히 Int64로 타입이 나온다

 

질 수 없지

optional 도 체크해제 하고 저장해본다

에러 발생..

속성값이 non-optional 일때, 값이 전달되지 않으면 오류가 발생한다

 

그리고 저장된 데이터들 중에 nil이 있는데 이후에 속성 값을 non-optional로 설정하면 역시 오류가 발생한다

 

속성 타입을 잘 관리해야 나중에 오류를 피할 수 있을 것 같다

댓글