ste*_*her 11 xcode objective-c
鉴于此协议定义:
@protocol MyProtocol <NSObject>
@property (nonatomic, strong) NSString *someProperty;
@end
Run Code Online (Sandbox Code Playgroud)
为什么Xcode很乐意为此声明提供自动完成功能:
id<MyProtocol> thing = [ThingManager currentThing];
[thing someProperty]; // Xcode offered autocompletion here
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用点符号访问相同的属性时,它不提供自动完成功能:
id<MyProtocol> thing = [ThingManager currentThing];
thing.someProperty; // Xcode claimed there were
// "No completions" available
// after the period
Run Code Online (Sandbox Code Playgroud)
因为id是基本类型,Xcode和CLANG对于提供针对它的点语法访问感到不安,因为点语法只是对普通对象中关联的setter或getter的方法调用的语法糖,但id没有已定义的方法成员.从事物的C方面来看,id是结构指针的typedef,编译器无法看到它们的成员,这意味着它无法访问它们(更不用说在dot-access之前你需要取消引用id的事实使任何语义感).
回到Objective-C方面,协议实际上并没有向声称实现它们的类添加方法或属性,而是作为其他类的说明符,符合给定协议的对象实现了一系列方法.至于方法语法的完成,Xcode会将导入到给定.m文件中的所有文件的所有给定方法汇集在一起,因为id类型的对象可以接收任何消息*
*当然,它可以接收消息,但如果没有实现它仍然会崩溃.
| 归档时间: |
|
| 查看次数: |
1857 次 |
| 最近记录: |