2012-11-13 48 views
0

我有一個類用作轉發代理的通用代理。通過執行respondsToSelectorforwardInvocation我可以使用這個類來轉發選擇器,這些選擇器可以發送給各種UI控件的代理。用於協議的Objective-C代理Xcode編譯器警告

問題是,當我使用這個類時,我得到一個編譯器警告。例如,如果我用它來郵件轉發到的UITableViewDelegate:

DelegateForwarder* _forward = [[DelegateForwarder alloc] init]; 
_tableView.delegate = _forward; 

我得到的編譯器警告:

Assigning to id<UITableViewDelegate> from incompatible type 'DelegateForwarder' 

我知道,因爲DelegateForwarder不採用UITableViewDelegate委託生成警告,但我不希望它 - 因爲它提供的轉發機制是完全通用的。

儘管警告我的代碼按預期運行。

有什麼我可以做的,以某種方式表明它使用消息轉發的編譯器和這個類的用戶,所以它不採用特定協議的事實不是一個問題?

+0

不完全確定自己在這裏,但'id _forward = [[DelegateForwarder alloc] init];'刪除警告? –

+0

@PhillipMills你是一個天才 - 是的,它確實:-) - 如果你可以擴展爲什麼這個作爲問題的答案,我會upvote和接受。 – ColinE

回答

3

拓展上的評論....

由於id被稱爲「通用對象類型」,它的使用是一個信號類型檢查機制被引用的對象的性質是完全考慮動態。這意味着代碼,如...

DelegateForwarder* _forward = [[DelegateForwarder alloc] init]; 
_tableView.delegate = _forward; 

...意味着DelegateForwarder變量應進行一致性檢查,而...

id _forward = [[DelegateForwarder alloc] init]; 
_tableView.delegate = _forward; 

...是「相信我」類型的聲明。

+0

謝謝 - 簡潔明瞭的解釋。從C#移到Objective-C並非沒有困難! – ColinE

+2

只需添加,-init方法通常返回id,因此'_tableView.delegate = [[DelegateForwarder alloc] init]'也是一個選項。 –

+0

和鑄造也做這個工作:'_tableView.delegate =(id)_forward;'。這些都是關於壓制編譯器類型檢查。 – dmitri

0

檢查您是否將<UITableViewDelegate>添加到DelegateForwarder的協議列表中。一般來說,這比用通用的「id」類型初始化更合適。

+1

從原始問題引用:*「我知道警告是由於DelegateForwarder不採用UITableViewDelegate委託而生成的」* –

+0

Agrh。沒有足夠的重視,對不起:))。然後,是的,使用(id)(即_tableView.delegate =(id)_forward;)或使用id-type進行初始化。 – kovpas