Code Bye

protocol能不能cast成一个对象

 

比方说
@interface A: NSObject<B_Protocol>
但是我在某个方法里只能拿到B_Protocol   b,要怎么把它cast成A啊
我试过直接用 A *a = b;
但是 好像会有问题,要肿么破。。求教><
谢谢啦>.<


5分
A *a = (A*)b;

25分
引用 1 楼 u014609935 的回复:

A *a = (A*)b;

在oc中协议不是类型,所以你不能使用协议来定义一个变量的类型。如这样定义一个协议类型

B_Protocol b;

 
在编译时就会报错。所以也就不存在协议转对象的用法。
但你可以这样来使用协议

id<B_Protocol>  delegate;

这里的id<B_Protocol> 表示实现了协议的对象。判断一个对象是否实现了某个协议可以通过如下代码来判断

[MyClass conformsToProtocol:@protocol(B_Protocol)];
引用 2 楼 zhanglei5415 的回复:
Quote: 引用 1 楼 u014609935 的回复:

A *a = (A*)b;

在oc中协议不是类型,所以你不能使用协议来定义一个变量的类型。如这样定义一个协议类型

B_Protocol b;

 
在编译时就会报错。所以也就不存在协议转对象的用法。
但你可以这样来使用协议

id<B_Protocol>  delegate;

这里的id<B_Protocol> 表示实现了协议的对象。判断一个对象是否实现了某个协议可以通过如下代码来判断

[MyClass conformsToProtocol:@protocol(B_Protocol)];

那样的话,BMKPointAnnotation是实现了BMKAnnotation协议的,然后在
– (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation里
传入了一个BMKPointAnnotation,现在我在函数
– (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view里通过view.annotation获取到的就是 id< BMKAnnotation>,那我要怎么从这个里获得我之前传进去的BMKPointAnnotation呢。

引用 1 楼 u014609935 的回复:

A *a = (A*)b;

我试过了,跟直接A *a = b;没有区别,里面的各个属性保存的好像都是十六进制地址不是值。


10分
正式协议和非正式协议都不是OC对象,在OC里,协议是一种弱化的接口,不能直接用于声明
引用 3 楼 spoonysnail 的回复:
Quote: 引用 2 楼 zhanglei5415 的回复:
Quote: 引用 1 楼 u014609935 的回复:

A *a = (A*)b;

在oc中协议不是类型,所以你不能使用协议来定义一个变量的类型。如这样定义一个协议类型

B_Protocol b;

 
在编译时就会报错。所以也就不存在协议转对象的用法。
但你可以这样来使用协议

id<B_Protocol>  delegate;

这里的id<B_Protocol> 表示实现了协议的对象。判断一个对象是否实现了某个协议可以通过如下代码来判断

[MyClass conformsToProtocol:@protocol(B_Protocol)];

那样的话,BMKPointAnnotation是实现了BMKAnnotation协议的,然后在
– (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation里
传入了一个BMKPointAnnotation,现在我在函数
– (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view里通过view.annotation获取到的就是 id< BMKAnnotation>,那我要怎么从这个里获得我之前传进去的BMKPointAnnotation呢。

判断view.annotation 是不是BMKPointAnnotation 类型的对象

if  ([view.annotation isKindOfClass:[BMKPointAnnotation class]]) {
        ///////....todo
}
引用 5 楼 zhangao0086 的回复:

正式协议和非正式协议都不是OC对象,在OC里,协议是一种弱化的接口,不能直接用于声明

那我要怎么做

引用 7 楼 spoonysnail 的回复:
Quote: 引用 5 楼 zhangao0086 的回复:

正式协议和非正式协议都不是OC对象,在OC里,协议是一种弱化的接口,不能直接用于声明

那我要怎么做

if  ([view.annotation isKindOfClass:[BMKPointAnnotation class]]) {
        BMKPointAnnotation *pointAnnotation = (BMKPointAnnotation *)view.annotation;
}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明protocol能不能cast成一个对象