将类的实例强制转换为Objective-C中的@协议

将类的实例强制转换为Objective-C中的@协议,objective-c,protocols,Objective C,Protocols,我有一个对象(UIViewController),它可能符合或不符合我定义的协议 我知道我可以确定对象是否符合协议,然后安全地调用该方法: if([self.myViewController conformsToProtocol:@protocol(MyProtocol)]) { [self.myViewController protocolMethod]; // <-- warning here } 防止这种警告的正确方法是什么?我似乎无法将self.myViewControl

我有一个对象(UIViewController),它可能符合或不符合我定义的协议

我知道我可以确定对象是否符合协议,然后安全地调用该方法:

if([self.myViewController conformsToProtocol:@protocol(MyProtocol)]) {
    [self.myViewController protocolMethod]; // <-- warning here
}

防止这种警告的正确方法是什么?我似乎无法将
self.myViewController
转换为
MyProtocol
类。

您可以这样转换它:

if([self.myViewController conformsToProtocol:@protocol(MyProtocol)])
{
    id<MyProtocol> p = (id<MyProtocol>)self.myViewController;
    [p protocolMethod];
}
if([self.myviewcontrol:@protocol(MyProtocol)])
{
id p=(id)self.myViewController;
[p协议方法];
}

这也让我有点沮丧。在Objective-C中,协议本身不是类型,因此您需要在指定所需协议的同时指定
id
(或其他类型,如
NSObject
)。

正确的方法是:

if ([self.myViewController conformsToProtocol:@protocol(MyProtocol)])
{
        UIViewController <MyProtocol> *vc = (UIViewController <MyProtocol> *) self.myViewController;
        [vc protocolMethod];
}
if([self.myviewcontrol:@protocol(MyProtocol)])
{
UIViewController*vc=(UIViewController*)self.myViewController;
[vc协议方法];
}
UIViewController*
类型转换转换为“vc是符合MyProtocol的UIViewController对象”,而使用
id
转换为“vc是符合MyProtocol的未知类的对象”


这样,编译器将在
vc
上为您提供正确的类型检查-编译器仅在调用
UIViewController
上未声明的任何方法时才会向您发出警告
id
仅在您不知道所投射对象的类别/类型的情况下使用。

啊,太酷了,谢谢。我刚刚检查了一下,发现将其转换为
(id)
也可以。这是错误的形式吗?如果您将其强制转换为id,那么如果您使用该协议中未定义的方法,编译器将警告您。@dreamlax-编译器就是这样对协议进行类型检查的。有关详细信息,请参阅。@Ford-最好专门使用协议,因为这样编译器可以为您执行一些类型检查。@Andy,我认为您不需要“*”,因为“id”已经是指针了。So:id p=(id)self.myViewController;[p协议方法];或者只是:[(id)self.myViewController协议方法];在使用协议时,您真的不应该关心对象类型——协议的全部要点是,任何对象类型都可以采用它并使用它,而不必强制转换到特定的对象。因此,我建议您在向协议强制转换的任何位置使用@andy的答案,而不是上面的--
idp=(id)self.myViewController
这个答案和@andys都是正确的,但他的答案更正确。@Answerbot您的评论不正确,没有抓住我在答案最后一段中提出的要点。您可能关心对象类型,也可能不关心,这取决于具体情况。如果您想在我的回答中的示例中将
UIViewController
上声明的消息发送到
vc
,并且声明为
id
,会发生什么情况?不确定关于我的评论的内容是否不正确?在任何情况下,如果要检查对象是否符合协议,那么为什么要调用与协议无关的其他方法?我记不起曾经需要做这件事,或者在我看过的代码中看到过这件事。对我来说似乎是一种代码味道。仅仅因为你没有看到/使用过它,并不意味着它是一种代码味道。下面是一个代码片段,显示了使用
id
丢弃类型信息是一个问题的一个示例:
if ([self.myViewController conformsToProtocol:@protocol(MyProtocol)])
{
        UIViewController <MyProtocol> *vc = (UIViewController <MyProtocol> *) self.myViewController;
        [vc protocolMethod];
}