Xamarin iOS中NSArray无法foreach遍历或按索引取值的原因是什么?
问题原因
Xamarin.iOS 中的 NSArray 是 Objective-C 原生 NSArray 类型的C#绑定封装,和Objective-C编译器原生支持NSArray快速遍历、下标访问语法糖不同,Xamarin的NSArray默认没有实现C#的IEnumerable接口,也没有预置下标索引器,所以直接使用foreach遍历或者[]下标取值都会触发编译器报错。
解决方案
- 索引取值:用
NSArray内置的GetValueAt()方法代替下标访问,传入参数需要转为无符号整数nuint类型 - foreach遍历:可以先将
NSArray转为C#可枚举集合后再遍历,比如调用OfType<NSObject>()、Cast<NSObject>()扩展方法,或者直接转成数组/List使用
修正后的代码示例如下:
try { NSData value = (NSData)NSUserDefaults.StandardUserDefaults["accounts"]; NSKeyedUnarchiver unarchiver = new NSKeyedUnarchiver(value); NSArray valuesDictionary = (NSArray)NSKeyedUnarchiver.UnarchiveObject(value); // 修正后的foreach遍历写法 foreach (var x in valuesDictionary.OfType<NSObject>()) { // 此处处理遍历逻辑 } if (valuesDictionary != null) { var accountList = new List<Account>(); int numberOfOrgs = (int)valuesDictionary.Count; for (int x = 0; x < numberOfOrgs; x++) { // 修正后的索引取值写法 var org = valuesDictionary.GetValueAt((nuint)x); } } }
如果确定NSArray内的元素都是相同类型,也可以直接转成强类型数组,后续即可直接使用下标和foreach遍历:
// 示例:假设元素都是NSDictionary类型 var items = NSArray.FromArray<NSDictionary>(valuesDictionary); // 直接遍历 foreach (var item in items) { // 业务逻辑 } // 直接用下标访问 var firstItem = items[0];
内容的提问来源于stack exchange,提问作者GuybrushThreepwood
相关产品推荐
相关产品推荐

