分配给id后,Xcode无法识别属性

时间:2016-03-05 09:00:33

标签: objective-c

我内部有两个不同的NSMutableArray个对象。我试图识别数组的第一个对象并正确分配它。这是我的想法

的示例代码
// I should declare a variable here, firstly I thought about "id someObject;" 
// and assigning to it in if statement.

id someObject;

if ([[someArray objectAtIndex:0] isKindOfClass:[firstOpponent class]]) {
    someObject = (firstOpponent*)[someArray objectAtIndex:0];
} else {
    someObject = (secondOpponent*)[someArray objectAtIndex:0];
}

[someObject method]; // this is OK
someObject.position; // property 'position' not found on object of type '__strong id'

用于声明“id someObject”的想法在if语句之前,属性存在一些问题。我读到这是不可能的,这就是为什么我要求其他解决方案。

2 个答案:

答案 0 :(得分:1)

您的if声明在输入方面没有任何效果。

在Objective-C中,引用类型(例如(firstOpponent *))上的强制转换在运行时不执行任何操作;它只是允许编译器产生更好的错误消息。

在您编写的代码中,它告诉编译器引用的类型,然后立即分配给类型id的变量 - 这是最常用/最不具体的对象引用类型 - 和编译器现在对someObject的内容一无所知,除了它包含对某个对象的引用。

所以你的代码相当于:

id someObject;
someObject = someArray[0];

[someObject method]; // this is OK
someObject.position; // compile time error

在类型为id的引用上调用方法时,在您的情况someObject中,编译器会执行检查并只允许方法调用。在运行时,会进行检查以验证实际的对象引用是否支持该方法,如果不是,则会发生运行时错误并且应用程序将被中止。

但是编译器只会在它知道的类型的对象上调用属性。这是因为它需要知道类型以确定将属性访问转换为哪种方法调用。通常,但并非总是如此,属性访问:

object.property // read a value
object.property = value // write a value

转换为方法调用:

[object property]
[object setProperty:value]

因此,您可以通过自己进行翻译并编写第二对中的一个来访问该属性。如果在运行时参考对象不支持该属性,那么您将收到错误,您的应用程序将中止。

另一个选择是定义一个协议,比如OpponentProtocol,它声明所有对手类应该实现的方法和属性,然后让你的对手类实现它。然后你可以声明:

id<OpponentProtocol> someObject;

其中类型表示&#34;任何对象引用,只要它实现协议OpponentProtocol&#34;。使用这种类型,编译器知道如何将属性访问转换为适当的方法调用,因此您可以访问OpponentProtocol上的someObject属性。

HTH

答案 1 :(得分:0)

您应该创建一个两个类可以确认并使用do shell script "echo hello \" Mr. X\" " 而不仅仅是id < MY_PROTOCOL >的协议,以便编译器知道该类能够响应的内容。