2011-09-19 6 views
0

내 코드가 제대로 작동하지만 경고 메시지가 표시되므로 더 잘 수행 할 수 있다고 생각합니다. NSObject (Objects)의 하위 클래스가 있고 Object (subObject)의 하위 클래스가 있습니다. subObjects에 선언 된 속성이 있습니다. 하나의 NSMutableArray에 Object의 모든 다른 하위 클래스 인 많은 객체를 저장합니다. 때로는 배열을 통해 특정 객체에 대한 특정 작업을 수행합니다. 나는이처럼 내 배열로부터 읽어 :이 경우 개체의 하위 클래스 속성 사용

//I have declared an Objects "myObject" earlier in my code. 
//c is an int used to select an object from the array 
myObject = [arrayObjects objectAtIndex:c]; 

, 나는

[myObject property] 

나는 그렇게는 할 수 없어야 설정 한 때문에 코드가 작동하기 때문에 하위 객체에 선언 내 속성에 액세스하고 subObject가 아닌 코드의이 부분을 얻으려면. 그러나 컴퓨터가 이것을 모르기 때문에 경고 메시지가 나타납니다. myObject가 subObject가 아니라 Object라는 것을 알고 있습니다. 이 문제를 해결하고 경고를 없애려면 어떻게해야합니까?

답변

1

, 당신은 이러한 가능성이 있습니다

  • 당신이 할 수있는 SubObject로 추출한 항목을 직접 선언하십시오 :

    SubObject *myObject = [arrayObjects objectAtIndex: c]; 
    [myObject setProperty: 17]; 
    
  • 또는 캐스트 :

    Object *myObject = [arrayObjects objectAtIndex: c]; 
    [(SubObject*)myObject setProperty: 17]; 
    
  • 또는 당신은 단순히 ID를 사용합니다. 당신이 ID를 사용하는 경우, 컴파일러는 아무것도지지 않습니다 및 경고를 발행하지 않습니다 :

    id myObject = [arrayObjects objectAtIndex: c]; 
    [myObject setProperty: 17]; 
    
+0

감사합니다! 나는 다른 물건을 만들지 않는 것이 훨씬 더 효율적이라고 확신합니다. – WolfLink

+0

예,하지만 SubObject 클래스에 대해 속성이 정의되었다고 했으므로 배열에 여러 객체 유형 (Object, SubObj1, SubObj2, ..)이 포함되어있는 경우 이해했거나 잘못 이해 했으므로 첫 번째 제안이 올바르게 작동하지 않습니다. . 또한 SubObj 유형이 아닌 다른 객체를 사용하면 다른 변수 (포인터 여야 함!) 만 소개하면됩니다.다시 말하지만 (나는 잘못 이해했을 수도 있음) - 단지 발언으로 만, 나는 런타임 전에 ID 검사를 사용하는 것처럼 많은 수의 (유형) 검사를 강요하는 경향이 있지만 나중에 추한 오류를 줄 수 있습니다 ... – user387184

+0

그가하지 않았다면 아직 아무 것도 추출하지 못했고 모든 것이 SubObject 유형이라는 것을 확신합니다. 그러면 작동 할 것입니다. 그렇지 않으면 그는 캐스팅하거나 ID를 사용할 수 있습니다. –

1

배열에서 가져온 객체가 모두 "올바른지"확인하기 전에 subObject 유형으로 선언되었는지 확인해야합니다. 그렇다면 컴파일러는 경고를 더 이상주지 않을 것입니다 ...

예. 뭔가 같은 :

Object objO; 

objO = [myarray objectAtIndex: n]; 

if (myMakingSure) { 
    SubObject objS; 
    objS = (SubObject) objO; 
    x= [objS getProperty]; 
} 

PS는 또한이 올 경우 답변을 받아 들일 것을 확인하십시오 - 다른 사람이 귀하의 질문에 대답을 주저 할 수있다 ... (필자는 처음에 모르고도있어 그것에 대해 좋은 주)가있는 NSMutableArray의 모든 개체가 (유형 이름은 대문자 문자로 시작해야합니다) 유형의 하위 개체의 있는지 경우

+0

감사합니다! 나는 이것을 시도하고 오류가 사라지고 그것은 작동하는 것 같습니다. 게시 한 코드의 유일한 문제점은 배열에서 objS를 다시 가져와야한다는 것입니다. BTW : 이것은 내가 합법적 인 대답을 얻은 첫 번째 질문입니다. – WolfLink

+0

그러나 다소 과장되었습니다. 추가 변수를 도입하고 할당 할 필요가 없습니다. 원래 유형을 원하는 유형으로 변환하십시오. 또는 대안 중 하나를 사용하십시오. 내 대답을 참조하십시오. –

+0

"다시해야"하는 것이 무엇을 의미합니까 - 왜 당신은 처음에 그것을 얻을 수없고 내가 제안한 것처럼 그것을 할 수는 없습니까? 설명해 주시겠습니까? 감사합니다 – user387184

관련 문제