2014-02-12 3 views
2

iOS 앱에서 JSONModel을 사용하고 있으며 일부 경고에 직면하고 있습니다.JSONModel : generic 형식의 NSArray를 채우는 중

의 내가

CTVContact.h

@interface CTVContact : JSONModel 
@property (nonatomic, strong) NSArray<Optional, CTVPhone> *phone; 
@end 

CTVContact.m이

NSMutableArray *phones = [[NSMutableArray alloc] init]; 
for(NSString *p in personPhones) { 
    CTVPhone *phn = [[CTVPhone alloc] init]; 
    phn.original = p; 
    [phones addObject:phn]; 
}  
phone = [NSArray arrayWithArray:phones]; 

는 기본적으로 마법처럼 모든 작동하지만 내가 경고가이 JSONModel 있다고 가정 해 봅시다 다음을 진술하십시오 :

Incompatible pointer types assigning to 'NSArray<Optional,CTVEventParticipant> *' from 'NSArray *' 

어떻게 경고 할 수 있습니까? 그 경고없이 모든 배열 값을 전화 배열에 할당하는 올바른 방법을 찾을 수 없습니다.

미리 감사드립니다.

답변

11

NSArray<Optional, CTVPhone> *phone;는이 프로토콜을 준수 배열을 취하는 변수를 정의합니다. 변수 (phone)를 해당 프로토콜을 준수한다고 명시하지 않은 배열로 설정하려고하면 컴파일 경고가 표시됩니다.

phone = [NSArray arrayWithArray:phones];은 특별한 프로토콜을 구현하지 않고 '일반'배열을 만듭니다. 그래서 경고를받습니다.

아마도 올바른 일은 @property 정의에서 프로토콜을 제거하는 것입니다. 당신은 또한 당신이 실제로 사용해야하는 프로토콜을 준수하는 NSArray 서브 클래스 ...

를 가지고 있고, 당신이 그 프로토콜에 정의 할 수있는 방법 호출을 시도하지 않는 것이 가정하지 않는 한 :

phone = (NSArray <Optional, CTVPhone> *)[NSArray arrayWithArray:phones]; 

기본적으로 컴파일러에게 의미있는 캐스트가 추가됩니다. '나를 믿으세요. 괜찮습니다'...

+0

프로토콜을 제거하면 JSONModel이 작동을 멈추고 JSON을 올바르게 모델링하지 못합니다. 모델 컬렉션 섹션을 살펴보십시오. https://github.com/icanzilb/JSONModel/blob/master/README.md#magical- data-modeling-for-json – asheinfeld

+0

충분히 공정하고, 대안을 추가했습니다. – Wain

+0

매력처럼 작동합니다! 감사! – asheinfeld

0

NSArrayarrayWithArray 메서드가 NSArray을 호출 할 때 NSMutableArray으로 전달되므로 마지막 라인에서 불평 할 수 있습니다. 당신은 같은 phones 배열 copy를 호출하여이 멀리 얻을 수 있습니다 :

phone = [NSArray arrayWithArray:[phones copy]]; 
+0

답장을 보내 주셔서 감사 합니다만, 문제가 해결되지 않았으므로 중요한 문제는 인터페이스 i입니다. 배열 NSArray 및 NSArray 복사 할보십시오, 그래서 NSArray를 말합니다 ! = N SArray – asheinfeld

+0

@asheinfeld 왜 ''을 추가합니까? – Wain

+0

그래서 JSONModel이 작동합니다 :). 그것이 그들이 당신에게 그것을하도록 요구하는 방식입니다. – asheinfeld