From d841b0e731da6c0701b1ec6e3d0d55d990034171 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 5 Oct 2022 18:37:04 +0200 Subject: [PATCH] [Foundation] Add NSArray.ToArray and implement IEnumerable. For NSArray, implement: * A ToArray () method that returns an NSArray[]. * A ToArray () method that returns a T[]. * The IEnumerable interface. For NSArray, implement: * A ToArray () method that returns a T[]. This should make NSArray much better to work with from managed code. --- src/Foundation/NSArray.cs | 25 +++++++++++++- src/Foundation/NSArray_1.cs | 5 +++ tests/monotouch-test/Foundation/ArrayTest.cs | 33 +++++++++++++++++++ .../monotouch-test/Foundation/NSArray1Test.cs | 24 ++++++++++++++ 4 files changed, 86 insertions(+), 1 deletion(-) diff --git a/src/Foundation/NSArray.cs b/src/Foundation/NSArray.cs index d9b071172bb0..90108eecd021 100644 --- a/src/Foundation/NSArray.cs +++ b/src/Foundation/NSArray.cs @@ -37,7 +37,7 @@ namespace Foundation { - public partial class NSArray { + public partial class NSArray : IEnumerable { // // Creates an array with the elements; If the value passed is null, it @@ -429,5 +429,28 @@ public static NSArray From (NSObject[][] items) return null; } } + + public TKey[] ToArray () where TKey: class, INativeObject + { + var rv = new TKey [GetCount (Handle)]; + for (var i = 0; i < rv.Length; i++) + rv [i] = GetItem ((nuint) i); + return rv; + } + + public NSObject[] ToArray () + { + return ToArray (); + } + + IEnumerator IEnumerable.GetEnumerator () + { + return new NSFastEnumerator (this); + } + + IEnumerator IEnumerable.GetEnumerator () + { + return new NSFastEnumerator (this); + } } } diff --git a/src/Foundation/NSArray_1.cs b/src/Foundation/NSArray_1.cs index 5c42361c8e7b..eb44a1a5cc5f 100644 --- a/src/Foundation/NSArray_1.cs +++ b/src/Foundation/NSArray_1.cs @@ -89,5 +89,10 @@ public TKey this [nint idx] { return GetItem ((nuint)idx); } } + + public new TKey[] ToArray () + { + return base.ToArray (); + } } } diff --git a/tests/monotouch-test/Foundation/ArrayTest.cs b/tests/monotouch-test/Foundation/ArrayTest.cs index 6836eb54031b..0f07e80b23c2 100644 --- a/tests/monotouch-test/Foundation/ArrayTest.cs +++ b/tests/monotouch-test/Foundation/ArrayTest.cs @@ -8,6 +8,7 @@ // using System; +using System.Linq; using Foundation; using ObjCRuntime; using Security; @@ -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 (); + 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"); + } + } } } diff --git a/tests/monotouch-test/Foundation/NSArray1Test.cs b/tests/monotouch-test/Foundation/NSArray1Test.cs index 7f14655e4952..92eafc2bf3af 100644 --- a/tests/monotouch-test/Foundation/NSArray1Test.cs +++ b/tests/monotouch-test/Foundation/NSArray1Test.cs @@ -93,5 +93,29 @@ public void FromNSObjectsNullTest () Assert.AreSame (str3, arr [2], "NSArray indexer"); } } + + [Test] + public void ToArray () + { + using (var a = NSArray.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.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"); + } + } } }