Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么可以';t类型为id的变量<;someProtocol>;接收id为的参数<;其他协议>;即使';其他协议';符合';一些协议';?_Objective C_Ios_Macos_Polymorphism_Protocols - Fatal编程技术网

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;
}