Objective c 为什么可以';t类型为id的变量<;someProtocol>;接收id为的参数<;其他协议>;即使';其他协议';符合';一些协议';?
假设我有两个协议:Objective c 为什么可以';t类型为id的变量<;someProtocol>;接收id为的参数<;其他协议>;即使';其他协议';符合';一些协议';?,objective-c,ios,macos,polymorphism,protocols,Objective C,Ios,Macos,Polymorphism,Protocols,假设我有两个协议: @protocol A @end 及 @协议B//协议B符合协议A。 @结束 还有两个变量: id<A> myVar = nil; id myVar=nil; 及 id otherVar=//正确初始化为符合的某个类; 那么,为什么我不能将“otherVar”分配给“myVar” myVar = otherVar; //Warning, sending id<B> to parameter of incompatible type id<
@protocol A
@end
及
@协议B//协议B符合协议A。
@结束
还有两个变量:
id<A> myVar = nil;
id myVar=nil;
及
id otherVar=//正确初始化为符合的某个类;
那么,为什么我不能将“otherVar”分配给“myVar”
myVar = otherVar; //Warning, sending id<B> to parameter of incompatible type id<A>
myVar=otherVar//警告,正在向id类型不兼容的参数发送id
谢谢 检查它是否符合StopRotocol(),如果符合,则像这样强制转换它
myVar = (id <A>)otherVar;
myVar=(id协议的(B
)声明(不仅仅是它的前向声明)是否可见?声明是否在myVar=otherVar;
之前
当申报顺序正确时,clang没有抱怨
举例说明:
@protocol A
@end
@protocol B; // << forward B
void fn() {
id<A> myVar = nil;
id<B> otherVar = nil;
myVar = otherVar; // << warning
}
// declaration follows use, or is not visible:
@protocol B <A>
@end
@协议A
@结束
@协议B;//是否尝试强制转换变量?我无法复制此变量。协议是否在单独的文件中?导入的标题是什么?导入的位置是什么?是的,协议在单独的文件中。问题在于文件的可见性。我在导入文件时使用了转发声明。谢谢Justin!您是对的,问题是问题在于协议的可见性。
myVar = (id <A>)otherVar;
@protocol A
@end
@protocol B; // << forward B
void fn() {
id<A> myVar = nil;
id<B> otherVar = nil;
myVar = otherVar; // << warning
}
// declaration follows use, or is not visible:
@protocol B <A>
@end
@protocol A
@end
@protocol B <A>
@end
void fn() {
id<A> myVar = nil;
id<B> otherVar = nil;
myVar = otherVar;
}