2015-11-08 41 views
2

我是Objective-c的新手,我认为这应该很简单,但不知何故我无法弄清楚。如何从数组中的对象调用方法?

我需要调用存储在NSArray中的对象的方法。 Java代码将是:myArray[0].getMyValue();

所以我在互联网上看到,在Objective-c它应该看起来像这样:[[myArray objectAtIndex: 0] getMyValue]。不幸的是,这没有奏效。

我在互联网上发现了其他解决方案,但都没有工作。

所以我希望你们能帮助我?

更新

我得到这两个错误消息:

  • 对于选择 'getMyValue'
  • 没有一个已知实例方法发送 'ID' 不兼容类型的参数 'CGFloat的' (又名'双')
+2

详细信息。你是什​​么意思,它不起作用?它不会编译?它在运行时崩溃吗?无论哪种方式,错误是什么? – Avi

+0

它不起作用,您需要将对象作为参数发送给您称为 –

+1

@ Mr.T的方法,这是完全错误的。为什么他应该提供该对象作为参数,如果他只是想调用该对象的实例方法? –

回答

7

这不起作用,因为Objective-C不知道数组中的对象的类型是什么。

幸运的是,Apple在Xcode 7中添加了轻量级泛型,它允许您创建类型化数组。只有当你打算在数组中有一种类型的对象时,这当然会起作用。语法如下:

NSArray<NSString *> *stringArray; 

如果您计划有不同类型的数组中的对象,那么你需要将对象转换为你的类型,才能够调用你的方法。这将是这样的:

[((YourObject *)[myArray objectAtIndex: 0]) getMyValue]; 

而作为@迈克尔在评论中指出,另一个和更好的方式来做到这一点是:

[((YourObject *)myArray[0]) getMyValue]; 
+0

你可以提供一个简单的测试方法,称为getMyvalue和你称之为你在这里提到的结果? –

+0

谢谢!这工作。 – Dalibor

+0

通过使用语法糖索引语法:'[myArray [0] getMyValue]'或(如果getMyValue是一个属性)'myArray [0] .myValue',您可以使它更像您的原始代码。您希望进行所有常规检查以确定是出界还是面临例外。 – Michael

3

对象与id类型存储在NSArray,所以你可以将这个对象转换为你想要的对象类型。例如:

NSNumber *myNumber = (NSNumber *)[NSArray objectAtIndex:0]; 
[myNumber myMethod]; 
+0

有没有办法在一行代码中有这个? – Dalibor

+1

@Dalibor看到我的答案,我向你展示了如何在一行中写这个。 –

相关问题