2012-03-21 4 views
2

필자는 핵심 데이터를 좀 더 멋지게 만들고, 너무 부 풀리지 않게 만드는 많은 기능을 만들고 있습니다.알 수없는 형식의 인수가있는 메서드를 선언 할 수 있습니까?

- (NSArray*)retrieveDataFrom:(NSString *) name where:(NSString *) where is:(NSString *) is { 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(%@ = '%@')", where, is]; 

    return [self retrieveDataFrom:name withPredicate:predicate]; 
} 

하고 가끔 (예를 들어)이 그런 짓을 할 : 대신의

[self retrieveDataFrom:@"table" where:@"id" is:int 2]; 

:

내가이처럼 보이는 방법이 있다고 가정하자

[self retrieveDataFrom:@"table" where:@"id" is:@"2"]; 

형식을 알지 못하고 인수를 수락 할 수있는 방법을 얻을 수있는 방법이 있습니까?

답변

2

하지 직접

[self retrieveDataFrom:@"table" where:@"id" is:[NSNumber numberWithInt:2]]; 

처럼 또는 new objective-c literals으로 볼 것이다. 입력을 NSObject *으로 선언하면 NSString * 또는 NSNumber *이 걸릴 수 있지만 여전히 NSNumber의 추악한 구문을 사용하면 방해가됩니다.

[self retrieveDataFrom:@"table" where:@"id" is:[NSNumber numberWithInt:2]]; 

그러나 더 나은 구문은 곧 Clang Language Extensions의 형식으로 제공 될 예정입니다.

이 땅이, 당신이 대신 쓸 수 있습니다

: 현재

[self retrieveDataFrom:@"table" where:@"id" is:@2]; 

는 LLVM 웹 사이트는 이러한 LLVM 4.0이 될 것이라고 말했습니다. 똑똑한 돈은 이것이 Xcode 4.4에있을 것이라고 말하고 있지만, 애플은 LLVM 웹 사이트의 성명서를 보지 않는다.

+0

나는 거의 기다릴 수 없다. – BoltClock

+0

동토. 나는 그들이 NSNull null에 대한 @null을 계획했으면 좋겠다. –

+0

이것은 내가 찾고있는 것입니다. Beeing NS 타입으로 충분합니다. 거기에서 NSNumber에서 int 등으로 변환을 설정할 수 있습니다. 또한 NSDictionary를 허용하고 해당 값을 여러 값으로 저장할 수 있습니다. 나는 지난밤을 생각하기에는 너무 피곤했다고 생각한다. 멋진 답변 주셔서 감사합니다! :) – Filibustr

1

그냥 (id) 대신 기껏

- (NSArray*)retrieveDataFrom:(NSString *) name where:(NSString *) where is:(id) is 
1

번호 (NSString *)의 사용, 당신은 id을 사용하여 모든 OBJ-C 타입을 수용 할 수 있지만, 당신은 인수가 어떤 유형에 동의 할 수 없습니다. 유일한 예외는 varargs를 사용하는 것입니다. 그러나 거기에서도 메소드는 인수를보기 전에 어떤 유형의 인수가 예상되는지 알 수있는 방법이 필요합니다 (예 : printf - 스타일 메소드는 형식 문자열을 사용하여 인수의 유형이 무엇인지 파악합니다). 될 것).

당신이 id를 사용하는 경우

, 당신의 방법은

- (NSArray *)retrieveDataFrom:(NSString *)name where:(NSString *)where is:(id)is; 

모양을 그리고 당신의 사용은

[self retrieveDataFrom:@"table" where:@"id" is:@2]; 
+0

나는 또한이 작업을 수행 할 수있는 것 같아요. id와 NSObject를 사용하는 것과 정확히 다른 점은 무엇입니까 (또는 동일합니까?)? – Filibustr

+0

참고로, NSObject는 대부분의 다른 클래스가 상속하고 서브 클래 싱되는 루트 클래스입니다. id는 객체에 대한 포인터 일뿐입니다.Objective-C는 동적으로 타입이 지정되므로 런타임에 id 유형의 객체를 동적으로 검사하여 전달중인 메시지를 지원하는지 여부를 확인합니다. 유형을 설정하면 컴파일러는 런타임 전에 사용자가 항목을 확인할 수 있습니다. 실제로, 그들은 유사하다, 그러나, 2 사이에는 큰 차이가있다. – Matias

+0

@Filibustr :'NSObject'는 가장 일반적인 루트 클래스입니다. 그러나'NSProxy'라고하는 초가 있습니다. 원할 경우 다른 것들을 생성 할 수 있습니다. 'id'는 일반적인 "모든 객체"포인터입니다. –

0

사용 (ID)

- (NSArray*)retrieveDataFrom:(id) name where:(id) whereIs:(id)is { 
    ... 
} 

또는 (있는 NSArray *)를 통과

- (NSArray*)retrieveDataFrom:(NSArray*) params { 
    ... 
} 
+0

그래, 방금 NSArray 또는 NSDict를 대신 사용할 수 있습니다. 나는 오늘 밤이 모든 대답을 시도 할 것이다. :) – Filibustr

관련 문제