只要我的第一个视图加载我的位置控制器就会调用-(void)locationFound
到其委托,[UIApplication sharedApplication].delegate
(我的AppDelegate)
我有一个相应的协议,只需要一个必需的方法locationFound。
我的AppDelegate标题中声明了协议遵从性:
@interface ProgramAppDelegate : UIResponder <UIApplicationDelegate, LocationFoundProtocol>
一切正常 - 除了我在我的位置控制器中分配代表时收到警告 - 就像这样:
self.positioningBrain.positioningNetworkingDelegate = [UIApplication sharedApplication].delegate;
它告诉我:
Assigning to 'id<LocationFoundProtocol>' from incompatible type 'id<UIApplicationDelegate>'
似乎它根本看不到我的AppDelegate确实符合我指定的协议 - 即使它是在标题中声明的。
为什么XCode会记录这种不匹配的原因?我对代码的工作并不感到惊讶,因为协议无论如何都应该是语义,但如果有更好的方法,我想知道。
答案 0 :(得分:3)
UIapplication的delegate属性返回以下类型
id<UIApplicationDelegate>
您必须将返回的类型强制转换为AppDelegates类型
... = (MyAppDelegate*)[UIApplication sharedApplication].delegate
答案 1 :(得分:1)
问题是编译器不知道[UIApplication sharedApplication].delegate
属于ProgramAppDelegate
类型;它只知道UIApplication的委托方法返回id<UIApplicationDelegate>
。如果要取消警告,则需要从知道应用程序委托的完整类型的某个位置分配positioningNetworkingDelegate
。 (例如,如果你在代理人自己的代码中,你可以说positioningBrain.positioningNetworkingDelegate = self
,这样就可以了。)
你也可以强制它说服编译器这是有效的:
self.positioningBrain.positioningNetworkingDelegate = (ProgramAppDelegate *)[UIApplication sharedApplication].delegate;
许多人为此目的制作快捷功能或宏。类似的东西:
#define APPDEL ((ProgramAppDelegate *)[UIApplication sharedApplication].delegate)