2013-06-16 1 views
1

속성이있는 클래스를 작성했습니다.이 클래스의 인스턴스를 변경 가능한 배열에 추가하고 그 후에 인스턴스의 num 속성을 설정하려고합니다. 하지만 올바른 구문을 모른다. 이 작업을 수행하는 올바른 구문 또는 방법을 알려주십시오.NSArray 안에 개체의 속성을 설정하는 방법

@interface ClassA : NSObject 

@property int num; 

-(void) method; 
+(id) getClassAObj:(int)number; 

@end 
-------------------------------- 
#import "ClassA.h" 

@implementation ClassA 

@synthesize num; 

-(void) method{ 
    NSLog(@"ClassA method Called"); 
} 
+(id) getClassAObj:(int)number { 

    ClassA *obj = [[ClassA alloc] init]; 
    obj.num = number; 
    return obj; 

} 

@end 
----------------------- 

이제 주에 나는 수동으로 납입 속성을 설정하려는하지만 난 내가 구문 잘못된 생각이나 할 수있다 그렇지 않으면 잘 모릅니다 올바른 구문

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 

     // insert code here... 
     NSLog(@"Hello, World!"); 

     NSMutableArray *array = [NSMutableArray arrayWithObjects: 
           [ClassA getClassAObj:9], 
           [ClassA getClassAObj:4], nil]; 
     NSLog(@"%i",[[array objectAtIndex:0] num]); 
     NSLog(@"%i",[array[1] num]); 
     //array[1].num = 3;    <--- Help needed here 
     //[[array[1]]num 3];    <--- this is also not correct syntax 

     NSLog(@"%i",[array[1] num]); 

    } 
    return 0; 
} 

무엇인지 잘 모릅니다 배열

답변

7

는 당신은 간다.

행운을 빌어 요!

편집 :

당신이 (그래서 충돌하지 않을 것이다, 그러나 또한 예상대로 작동하지 않습니다) 코드는 다음과 같이 할 수있는 객체의 유효성을 검사하려면 다음

id anObject = array[<index>]; 
if ([anObject isKindOfClass:[NSClassFromString(@"ClassA")]]) { 
    [(ClassA *)anObject setNum:<number>]; 
} 

당신이 원하는 경우 정확한 메시지 (이 경우 setter)를 유효화하려면 객체가이 선택자에 응답하는지 확인해야합니다. 이것은 클래스가 다른 객체를 가지고 있지만 모두 메시지에 응답 할 때 유용합니다. 그것은 다음과 같이 보일 것이다 : 어떤 이유로 그 인덱스에있는 객체 유형를 ClassA가 아닌 경우

id anObject = array[<index>]; 
if ([anObject respondsToSelector:@selector(setNum:)) { 
    [anObject setNum:<number>]; 
} 
+3

귀하의 코드는 일부 경우 실패합니다 그 인덱스의 객체가 ClassA 유형이 아닌 이유는 대답을 완료하기 위해 유효성 검사를 수행해야합니다.) – danypata

+2

객체를 id로 선언하고 메시지를 보내기 전에 객체가 setNum 메소드에 응답하는지 확인하는 것이 좋습니다. – Abizern

+0

@danypata : 배열의 다른 클래스를 기대하지 않는다면 유효성 검사가 실패하면 "글쎄, 우리는 괴롭혔어요. 고칠 필요가 있습니다."라고 말하는 것보다 훨씬 더 적절한 것은 없습니다. 어쨌든 잘못된 메시지를 보내면 이미 어떤 일을 할 것인가. – Chuck

3
array[1].num = 3; 

이 작동 것이다, 그러나, 문제는, 컴파일러는 배열에 넣어 경우 개체에 대한 형식 정보의 추적을 잃게 내에서 객체의 속성을 설정 할 수 있습니다. 런타임은 여전히 ​​오브젝트의 종류를 인식합니다. 컴파일러에게 정중하게 알려줘야합니다.

ClassA *anObject = array[<index>]; 
[anObject setNum:<yourNumber>]; 

당신은 또한 [<array> objectAtIndex:<index>] 방법을 사용할 수 있지만 위를 할 수있는 새로운 방법입니다 : 여기

((ClassA *)(array[1])).num = 3; 
+1

귀하의 코드가 실패합니다, 당신이 대답을 완료하기 위해 검증을 수행해야합니다) – danypata

관련 문제