【问题标题】:Proper way to use arrays in MonoMac在 MonoMac 中使用数组的正确方法
【发布时间】:2010-11-06 14:34:14
【问题描述】:

我刚刚开始在 MonoMac 中开展一个项目,到目前为止这非常酷。但仍有一些事情我不确定。例如:你如何使用数组?以下是我的发现:当我从正在调用的方法中返回 NSArray 并尝试获取该数组中的一个自定义对象时,我不断得到类似“cannot convert type System.IntPtr to MyType”的内容。

NSArray groupArray = (NSArray)groupDictionary.ObjectForKey(key);
MyType myObject = (MyType)groupArray.ValueAt(0);

这是我返回的数组。但是如果我想自己创建一个数组怎么办? NSArray 的实现不允许我实例化它。所以如果我得到MonoMac website 正确,我应该使用这样的普通数组

int[] intArray = int[10];

分别是一个强类型数组,我不知道如何在 C# 中使用它。

那么这里的路是什么?

谢谢
-f

【问题讨论】:

    标签: c# objective-c arrays nsarray monomac


    【解决方案1】:

    一般来说,使用 NSArray 不是很有用,因为您最终会遇到上述问题。

    这就是为什么通常应该将 NSArray 转换为强类型数组的原因。 MonoMac 低级运行时已代表您对所有回调执行此操作。

    通常你会这样做:

    YourType [] stronglyTyped = NSArray.ArrayFromHandle<YourType> (arrayIntPtrHandle);
    

    注意,NSArray 只能存储 NSObject,所以“YourType”需要是从 NSObject 派生的对象。

    现在,如果您仍想使用 NSArray,您需要记住的是 ValueAt 返回底层对象句柄(IntPtr),要在 C# 中使用它,您需要将其转换为 NSObject。您可以使用 Runtime.GetNSObject 方法执行此操作,您可以将结果转换为最派生的类型:

    YourType x = (YourType) Runtime.GetNSObject (NSArray.ValueAt (0));
    

    话虽如此,如果您使用 API 绑定工具来访问 Objective-C API,那么您就没有正确绑定事物。你的合约 API 应该有强类型版本,而不是 NSArray,所以:

     [Export ("getElements")]
     NSArray GetElements ();
    

    应该变成:

     [Export ("getElements")]
     YourType [] GetElements ();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-04
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 2017-09-28
      相关资源
      最近更新 更多