2012-10-17 3 views
0

다른 어떤 것보다 파이썬에 대한 경험이 많기 때문에 변경 가능 대 불변의 배열 및 dicts를 사용하는 것이 조금 이상합니다. 정말 4.5 추가했다 엑스 코드 리터럴 구문을 즐기고 있지만, 몇 가지 간단한의 간섭이 일에 나는이 같은 상황 건너에 대해 :리터럴 구문과 mutableCopy 및 Objective-C 컴파일러 경고

NSArray *myArray = [@[/*array objects here*/] mutableCopy]; 
[myArray addObject: @/*an object goes here*/]; 

및 컴파일러에서 myArray을 응답하지 않을 수 있습니다 "라는, 나에게 경고를 제공 to addObject "를 호출하십시오.

코드 컴파일 및 addObject 잘 작동합니다, NSLog 개체 수 있으며 myArray 존재하는지 확인 -하지만이 경고의 특성을 완전히 이해하지 못합니다. 이 상황에서 mutableCopy가 NSMutableArray를 반환하지 않습니까? 단순히 NSMutableArray를 사용하고 리터럴 구문을 사용하려고 시도하는 것이 더 적절합니까?

또한 바보 같은 경고이기 때문에 무시하고 계속할 수 있습니까? 그건 ... 최악의 경우 게으른 것 같아요. 그리고 아마도 미래의 헛소리들에 대한 문을 열어두기 만합니다.

+3

NSMutableArray를 NSArray 포인터에 할당했기 때문에 컴파일러 경고가 표시됩니다. 컴파일러는 당신의 말로 당신을 데리고 NSArray가'addObject'를 구현하지 않는다고 불평합니다. –

+0

슬프게도 나는 랩톱에서 Xcode로 멀리 떨어져있다. NSMutableArray와 같은 코드를 할당하려 할 때 리콜러가 mutableArray를 사용하지 않는 방법에 대해 다른 오류가 발생했습니다. 따라서 mutableCopy 메시지. 어쩌면 이것은 마지막 업데이트에서 변경되었거나, 아마도 내가 간과 한 것입니까? –

+0

오른쪽 - 당신은'mutableCopy' 호출을하지 않았으므로 리터럴로부터 얻은 것은 NSArray입니다. NSArray에'addObject'를 할 수 없습니다. 당신은 적절하게'mutableCopy' 호출을 추가했지만 동시에 결과 데이터 타입을 NSMutableArray로 변경하지 않았습니다. 이것이 당신의 문제입니다. –

답변

2

NSArray이 아닌 NSMutableArray으로 변수를 선언해야합니다. addObject:NSMutableArray에서만 사용 가능한 방법입니다.

편집 : 불필요한 @이있는 것 같습니다. 코드는해야한다 :

NSMutableArray *mutable = [@[a, b, c] mutableCopy]; 
[mutable addObject:d]; 
+0

나는 문자 그대로의 구문이 변경 가능한 목록, 딕트, 문자열 등에 대해서만 작용한다는 인상을 받았다. –

+0

-mutableCopy는 NSMutableArray를 반환한다. 변수에 리터럴을 할당하지 않으면 가변 복사본을 할당합니다. –

+0

그래, 나는'@'에 대해 궁금해했다. 나는 아직 문법적으로 사용하지 않았으므로 오류라고 확신하지는 못했다. –

0

합니까 mutableCopy이 상황에있는 NSMutableArray를 반환하지?

이 있습니다. 이것이 반환 값을 NSArray가 아니라 NSMutableArray에 지정해야하는 이유입니다.

NSMutableArray *myArray = [@[/*array objects here*/] mutableCopy]; 

은 컴파일러를 종료해야합니다.