Skip to content

Commit

Permalink
[Foundation] Add NSArray.ToArray and implement IEnumerable<NSObject>. (
Browse files Browse the repository at this point in the history
…#16252)

For NSArray, implement:

* A ToArray () method that returns an NSArray[].
* A ToArray<T> () method that returns a T[].
* The IEnumerable<NSObject> interface.

For NSArray<T>, implement:

* A ToArray () method that returns a T[].

This should make NSArray much better to work with from managed code.
  • Loading branch information
rolfbjarne authored Oct 6, 2022
1 parent f22ecb5 commit 273c2fa
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 1 deletion.
25 changes: 24 additions & 1 deletion src/Foundation/NSArray.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@

namespace Foundation {

public partial class NSArray {
public partial class NSArray : IEnumerable<NSObject> {

//
// Creates an array with the elements; If the value passed is null, it
Expand Down Expand Up @@ -429,5 +429,28 @@ public static NSArray From (NSObject[][] items)
return null;
}
}

public TKey[] ToArray<TKey> () where TKey: class, INativeObject
{
var rv = new TKey [GetCount (Handle)];
for (var i = 0; i < rv.Length; i++)
rv [i] = GetItem<TKey> ((nuint) i);
return rv;
}

public NSObject[] ToArray ()
{
return ToArray<NSObject> ();
}

IEnumerator<NSObject> IEnumerable<NSObject>.GetEnumerator ()
{
return new NSFastEnumerator<NSObject> (this);
}

IEnumerator IEnumerable.GetEnumerator ()
{
return new NSFastEnumerator<NSObject> (this);
}
}
}
5 changes: 5 additions & 0 deletions src/Foundation/NSArray_1.cs
Original file line number Diff line number Diff line change
Expand Up @@ -89,5 +89,10 @@ public TKey this [nint idx] {
return GetItem<TKey> ((nuint)idx);
}
}

public new TKey[] ToArray ()
{
return base.ToArray<TKey> ();
}
}
}
33 changes: 33 additions & 0 deletions tests/monotouch-test/Foundation/ArrayTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
//

using System;
using System.Linq;
using Foundation;
using ObjCRuntime;
using Security;
Expand Down Expand Up @@ -123,5 +124,37 @@ public void FromNSObjects ()
Assert.That (a.Handle, Is.Not.EqualTo (IntPtr.Zero), "Handle");
}
}

[Test]
public void ToArray ()
{
using (var a = NSArray.FromStrings (new string [1] { "abc" })) {
var arr = a.ToArray ();
Assert.AreEqual (1, arr.Length, "Length");
Assert.AreEqual ("abc", arr [0].ToString (), "Value");
}
}

[Test]
public void ToArray_T ()
{
using (var a = NSArray.FromStrings (new string [1] { "abc" })) {
var arr = a.ToArray<NSString> ();
Assert.AreEqual (1, arr.Length, "Length");
Assert.AreEqual ("abc", arr [0].ToString (), "Value");
}
}

[Test]
public void Enumerator ()
{
using (var a = NSArray.FromStrings (new string [1] { "abc" })) {
foreach (var item in a)
Assert.AreEqual ("abc", item.ToString (), "Value");
var list = a.ToList ();
Assert.AreEqual (1, list.Count (), "Length");
Assert.AreEqual ("abc", list [0].ToString (), "Value");
}
}
}
}
24 changes: 24 additions & 0 deletions tests/monotouch-test/Foundation/NSArray1Test.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,5 +93,29 @@ public void FromNSObjectsNullTest ()
Assert.AreSame (str3, arr [2], "NSArray indexer");
}
}

[Test]
public void ToArray ()
{
using (var a = NSArray<NSString>.FromNSObjects ((NSString) "abc")) {
var arr = a.ToArray ();
NSString element = arr [0];
Assert.AreEqual (1, arr.Length, "Length");
Assert.AreEqual ("abc", arr [0].ToString (), "Value");
Assert.AreEqual ("abc", (string) element, "Value element");
}
}

[Test]
public void ToArray_T ()
{
using (var a = NSArray<NSString>.FromNSObjects ((NSString) "abc")) {
var arr = a.ToArray ();
NSString element = arr [0];
Assert.AreEqual (1, arr.Length, "Length");
Assert.AreEqual ("abc", arr [0].ToString (), "Value");
Assert.AreEqual ("abc", (string) element, "Value element");
}
}
}
}

5 comments on commit 273c2fa

@vs-mobiletools-engineering-service2

This comment was marked as outdated.

@vs-mobiletools-engineering-service2

This comment was marked as outdated.

@vs-mobiletools-engineering-service2

This comment was marked as outdated.

@vs-mobiletools-engineering-service2

This comment was marked as outdated.

@vs-mobiletools-engineering-service2

This comment was marked as outdated.

Please sign in to comment.