NSArray objectAtIndex 不工作。请帮忙
Posted
技术标签:
【中文标题】NSArray objectAtIndex 不工作。请帮忙【英文标题】:NSArray objectAtIndex is not working. Please help 【发布时间】:2010-06-23 14:00:13 【问题描述】:NSArray* address = [NSArray arrayWithArray:[detailItem addressArray]];
NSLog(@"address = %@", address);
NSString* addressToString = @"";
int arrayCount = [address count];
for (int i = 0; i < arrayCount; i++)
addressToString = [addressToString stringByAppendingString:[address objectAtIndex:i]];
if (i == arrayCount -1)
addressToString = [addressToString stringByAppendingString:@""];
else
addressToString = [addressToString stringByAppendingString:@", "];
address 是一个保存地址的 NSArray
2010-06-23 09:05:19.346 iPhoneExample[1093:207] address = (
City = "Cupertino";
Country = "United States";
CountryCode = us;
State = CA;
Street = "1 Infinite Loop";
ZIP = 95014;
)
我正在尝试遍历数组并创建一个 CSV 字符串,使其看起来像
Cupertino, "United States", us, CA, "1 Infinite Loop", 95014
但是,我一直在崩溃
addressToString = [addressToString stringByAppendingString:@", "];
我收到的消息是
*** -[NSCFDictionary stringByAppendingString:]:无法识别的选择器发送到实例 0x1c2f10更新: detailItem 是 ABContact 类型的对象(自定义类)。
ABContact 有一个名为 addressArray 的属性
@property (nonatomic, readonly) NSArray *addressArray;我的addressArray的定义是
- (NSArray *) addressArray return [self arrayForProperty:kABPersonAddressProperty];【问题讨论】:
错误信息是自描述的——地址对象不是一个数组——它是一个字典,你应该相应地处理它。 我的类从 ABContact 类返回一个 NSArray 怎么样? 【参考方案1】:您的“地址”是 NSDictionary 的 NSArray,而不是 NSArray 的 NSArray。
要将字典的值作为数组获取,可以使用
[theDictionary allValues]
但订单上没有保证。我认为你真正需要的是:
NSMutableString* addressToString = [NSMutableString string]; // use mutable string!
for (NSDictionary* item in address) // use fast enumeration!
[addressToString appendFormat:@"%@, \"%@\", %@, %@, \"%@\", %@\n",
[item objectForKey:@"City"],
/* etc ... */
];
【讨论】:
唯一的问题是我传入的模型(detailItem)并不总是具有所有相同的属性。有些地址没有城市,州有些地址有邮政编码和州所以我怎样才能(以编程方式)确定要包含的内容。 Google 不喜欢使用 NSMutableString。 maps.google.com/maps/geo?q=%@&output=csv @orangecl4now anNSMutableString
is an NSString
,任何可以使用NSString
的地方都可以使用NSMutableString
@orange:如果城市不存在,-objectForKey:
将返回nil
。
orangecl4now:Google 对 NSMutableString 没有意见;实际上,您传递的对象类别并不重要。将nil
传递给%@
说明符将导致输出出现“(null)”,因此objectForKey:
返回nil
不是问题。您生成 URL 的代码有其他问题。【参考方案2】:
这个:
2010-06-23 09:05:19.346 iPhoneExample[1093:207] address = (
City = "Cupertino";
Country = "United States";
CountryCode = us;
State = CA;
Street = "1 Infinite Loop";
ZIP = 95014;
)
是NSDictionary。您将希望通过 [dictionary objectForKey:'City']
访问其成员
因此,您更新后的代码应为:
NSDictionary* address = [detailItem addressArray];
NSLog(@"address = %@", address);
NSString* addressToString = @"";
int counter = 0;
for (id object in myDictionary)
if (counter != 0)
addressToString = [addressToString stringByAppendingString:@","];
addressToString = [addressToString stringByAppendingString:object];
counter++;
【讨论】:
唯一的问题是字典objectEnumerator
不一定以任何顺序返回内容,因为字典本身不保持顺序。另外,您应该使用for..in
语法。它更简单。另外,您从未增加过counter
。我已经为你编辑了代码。 :) 另外顺便说一句,这将创建一个 lot 额外的自动释放对象。我会改用NSMutableString
。
谢谢!我忘了添加计数器增量... :) 我知道排序和自动释放对象的问题,但我想尽可能接近 OP 的原始代码。
huntaub:不,address
是一个 NSArray 实例(描述为(…)
)。它的唯一元素(描述为…
)是一个NSDictionary。【参考方案3】:
如果您可以将 addressArray
方法更改为实际返回数组而不是字典,那么您可以这样做:
NSString * addressString = [[detailItem addressArray] componentsJoinedByString:@","];
就是这样……
【讨论】:
以上是关于NSArray objectAtIndex 不工作。请帮忙的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3:UITabBarController 错误:'*** -[__NSArray0 objectAtIndex:]:索引 1 超出了空 NSArray 的范围'
*** 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“*** -[__NSArray0 objectAtIndex:]: index 0 beyond bounds fo
NSArray objectAtIndex 索引 1 超出 [0,0] 的范围?