转换为(id <protocol>)以保证属性存在

jon*_*dep 15 protocols objective-c

如果我有一些类似的课程

@property (nonatomic, retain) NSString* myString;
Run Code Online (Sandbox Code Playgroud)

并且想要在作为这些类之一的对象中访问该属性(但不知道它是哪个类型id),我显然得到"请求成员'myString'而不是结构或联合"错误.

所以,如果这些类中的每一个都符合:

@protocol myProtocol <NSObject>

@required

@property (nonatomic, retain) NSString* myString;

@end
Run Code Online (Sandbox Code Playgroud)

然后我像这样投下来获得财产:

(id<myProtocol>)anObject.myString
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?我仍然得到同样的错误.

Vik*_*ica 31

在这种情况下,我更喜欢使用点符号发送消息 - 因为它清楚显示,当演员阵容发生时:

这些线是相同的:

[(id<MyProtocol>)anObject myString]
((id<MyProtocol>)anObject).myString
Run Code Online (Sandbox Code Playgroud)

这些是:

(id<MyProtocol>)[anObject myString]
(id<MyProtocol>)anObject.myString
Run Code Online (Sandbox Code Playgroud)


jon*_*dep 6

忽略这个..结果只需要更多括号:

((id<myProtocol>)anObject).myString
Run Code Online (Sandbox Code Playgroud)

  • 换句话说,这是一个优先问题 - dot的优先级高于C中的强制转换 (4认同)