2009-12-21 3 views
0

"float pos = [보낸 사람 값];"오류가 발생했습니다 ... 보낸 사람이 인터페이스 작성기에서 설정 한 UISlider 여야합니다.오류 : 초기화 할 때 호환되지 않는 유형이 있습니까?

ButtonViewController.m

- (IBAction)slide: (id)sender { 
float pos = [sender value]; 
loadValue.progress = pos; 
} 

ButtonViewController.h

@interface Button_Fun4ViewController : UIViewController { 
IBOutlet UIProgressView *loadValue; 
} 

- (IBAction)slide: (id)sender; 

감사합니다.

+0

감사합니다. 그렇다면 "id"로 선언하는 것이 무엇입니까? – Devoted

+0

여기에 ID가있는 이유는 모든 대상/액션 메소드가 id를 사용하고 nil을 반환한다는 것입니다 (IBAction은 매크로입니다). addTarget : action : forEvents :는 UIControl 수준에서 정의되므로 UISliders뿐 아니라 모든 UIControl에서 작동해야합니다. UIControl에 캐스팅하는 것조차 숙련 된 개발자들에게는 혼란을 줄 수있는 이드를 통과하는 더 긴 타겟/액션 메소드의 역사에서 비롯된 것입니다. 기술적으로 당신은 UISlider에 매개 변수를 입력 할 수 있습니다. 아마도 작동 할 것입니다. 그러나 호출이 실제로 유형 안전하지 않기 때문에 해결 된 것보다 더 많은 놀라움이 생길 것입니다. –

답변

3

보낸 사람은 UISlider 여야하지만 컴파일러는이를 알지 못합니다. 모든 내용은 id이며, 일치하는 첫 번째 서명 서명에 바인딩됩니다. 아마도 float가 아닌 다른 것을 반환하는 컴파일러 일 것입니다 (그리고 최종 추측으로 컴파일러에서는 id을 반환한다고 가정합니다).

당신이 경우 UISlider에 이상이 타입 변환해야합니다 : 이것은 UISlider 나쁜 생각되지 않을 것 사실인지 확인해 더블

- (IBAction)slide: (id)sender { 
    float pos = [(UISlider *)sender value]; 
    loadValue.progress = pos; 
} 

NSAssert() 나에 if()를 사용하지만, ISN 엄격하게 필요한.

+0

UISlider * 로의 캐스트는 발신자 앞에 있어야하지만 대괄호 안에 있어야합니다. 이제 [보낸 사람 값]의 반환 값을 UISlider * – nash

1

발신자가 'id'유형이므로 컴파일러는 메시지에서 반환 할 내용을 모르고 'id'유형 값을 반환한다고 가정합니다. 보낸 사람을 UISlider로 캐스팅하거나 (컴파일러에서 -value가 float를 반환한다는 것을 알고 있으므로) 메시지의 반환 값을 float로 캐스팅해야합니다.

+0

이렇게하려고하면 "float pos = (float) [발신자 값];" 그것은 나에게 오류를 준다 : "포인터 값은 부동 소수점 값이 예상되는 곳에 사용된다". 이것은 무엇을 의미 하는가? – Devoted

+0

이렇게하면 안됩니다. 컴파일러에서는 [보낸 사람 값]이 id라고 가정하고 id (개체 포인터)를 float으로 캐스팅 할 수 없습니다. 컴파일러가 - 반환 값의 형식이 무엇인지 알 수 있도록 보낸 사람을 올바른 형식으로 캐스팅해야합니다. –

1

idsender이므로 유형을 나타내야합니다. 다음

사용 :

float pos = [(UISlider *)sender value]; 

또는 당신이 프로토콜을 사용할 수 있습니다. 그렇게하면 프로토콜을 준수하는 한 모두 동일한 방식으로 사용할 수있는 여러 유형의 객체를 수신 할 수 있습니다.

@protocol myProtocol { 
-(float)value; 
} 

-(void)myMethod:(id<myProtocol>)sender { 
    float pos = [sender value]; 
} 
+0

대기로 캐스팅하지만 "id"로 선언하는 시점은 무엇입니까? – Devoted

+0

후자의 구문 (cast to float)을 사용하면 'value'메시지에 응답하는 한 모든 유형의 객체를 전송할 수 있으며 'value' 메소드의 결과는 float로 형변환 될 수 있습니다. 객체의 유형은 중요하지 않습니다. 또는 전송을 원하지 않는다면 프로토콜을 사용할 수 있습니다. 선언문에'id sender'가 있습니다. – nash

+1

컴파일러는 여전히이 시점에서 -value가 id를 반환하고 있다고 생각하기 때문에 float로 변환 할 수 없습니다. 따라서 float로 변환 할 의사가 없습니다. 이것은 모든 객체 값 반환에는 작동하지만 float에 대해서는 작동하지 않습니다. 부동 반환 값은 ObjC에서 객체 반환 값보다 다르게 수행됩니다 (objc_msgSend()를 사용할 수 없으며 objc_msgSend_fpret()를 사용해야 함). –

관련 문제