2014-10-05 3 views
0

Swift의 NSManagedObject에있는 하위 클래스에 저장된 속성을 추가하려고하면 기본값을 제공하지 않고 (이니셜 라이저에서 할 것입니다.)Swift에서 NSManagedObject의 하위 클래스에 저장된 속성 추가하기

Stored property 'foo' requires an initial value or should be @NSManaged 

코드는 다음과 같다 : 나는이 오류가

class Thing : NSManagedObject{ 
    var foo : String 
    var bar : String 

    init(foo: String, bar : String){ 

     // blah, blah... 
    } 
} 

이 시행하는 이유는 무엇입니까? 왜 도대체 initialiser에서 초기화 할 수 없습니까?

+1

* 일시적인 속성 *을 사용할 수 있습니다. 일시적인 속성은 영구 저장소에 저장되지 않지만 Xcode는 해당 Swift 속성을 만들고 핵심 데이터 런타임은 필요한 접근 자 메서드를 만듭니다. - 또한 지정된 초기화 자'init (엔티티 엔티티 : NSEntityDescription, insertIntoManagedObjectContext 컨텍스트 : NSManagedObjectContext!)를 사용하여 관리 객체를 만들어야합니다. –

답변

4

편집 : 아래의 답변은 다양한 상황에 적용되며 이와 관련되어 있지만 NSManagedObject 상황을 정확히 설명하지는 않습니다. NSManagedObject의 경우 영구 저장소에서 객체를로드하고 특수 init을 호출하지 않고 초기화 할 수 있습니다. Swift는 이러한 경우에 foobar을 할당해야한다는 것을 모르기 때문에 다른 하위 클래스 화 상황에서 할 수있는 것처럼 final 또는 required을 사용하는 대신 일부 기본값이 필요합니다.

올바른 질문은 데이터 저장소에서이 개체를로드 할 때 핵심 데이터가 foobar과 어떻게 관련 될 것이라고 예상합니까?


컴파일러가 모든 서브 클래스가 구현하거나 init(foo,bar)를 호출 것을 입증 할 수 없기 때문에

. 서브 클래스가 그 초기화자를 구현하지 않았던 경우, foo 또는 bar는 초기화되지 않습니다.

여러 가지 방법으로 해결할 수 있습니다. 기본값을 제공 할 수 있습니다. 값을 명시 적으로 unwrapped 옵션 (기본값 : nil)으로 만들 수 있습니다. 값을 선택적으로 만들 수 있습니다. 이 초기화 프로그램을 required으로 선언하면 모든 하위 클래스에서이를 구현해야합니다. 또는 서브 클래스로 만들 수 없도록 Thingfinal으로 선언 할 수 있습니다.

+0

그리고 이것이 NSManagedObject의 서브 클래스 일 때만 왜 발생합니까? 선언에서 수퍼 클래스를 제거하면 잘 컴파일됩니다. – cfischer