我在我的程序中编写了一个非常糟糕的代码,在我学习 Objective C 和 iOS 平台时只是在玩弄。我所做的是,
我已经像这样创建了 NSMutableArray
,
placeInfo = [NSMutableArray array];
后来在我的代码中我正在做这样的事情,基本上我是在操纵 Google places api 响应(JSON)。
NSDictionary *results = [responseString JSONValue];
placeInfo = [results objectForKey:@"result"];
self.phoneNumber = (NSString *)[placeInfo objectForKey:@"formatted_phone_number"]; // In this line compiler warns me that NSMutableArray might not response to this.
我检查了文档,但没有在 NSMutableArray
中找到 objectForKey。
- 那么可能是什么原因呢?为什么我的代码没有崩溃?为什么它通过“formatted_phone_number”键返回电话号码?
编辑
在第一个答案之后,我编辑了我的代码并添加了这样的类型转换,但它仍然有效。
NSDictionary *results = [responseString JSONValue];
placeInfo = (NSMutableArray *)[results objectForKey:@"result"];
self.phoneNumber = (NSString *)[placeInfo objectForKey:@"formatted_phone_number"];
最佳答案
我从未使用过 Google Places API,但我猜 [results objectForKey:@"result"]
实际上会返回另一个字典,因此 objectForKey:
有效。
因为 objective-c 只是使用指针来引用对象,所以它实际上从未被转换为 NSMutableArray
。此外,由于 objective-c 的动态特性,它在编译时不知道某个方法是否存在(您实际上可以在运行时添加方法甚至整个类)。
根据编译器设置,它可能只显示一个警告,指出 objectForKey:
可能 在运行时找不到,并让它继续编译。如果你真的给它传递了一个 NSDictionary
,它最终会工作得很好。
即使你把 (NSMutableArray *)
cast 放在它前面,它也不会改变任何东西。这只是简单地转换指针类型,实际上并没有以任何方式改变对象。
关于iphone - 将消息发送到 objectForKey 到 NSMutableArray 实例,并且有效!!奇怪的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8429614/