我内部有两个不同的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语句之前,属性存在一些问题。我读到这是不可能的,这就是为什么我要求其他解决方案。
答案 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 >
的协议,以便编译器知道该类能够响应的内容。