You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 04:06:03