@@ -2022,7 +2022,39 @@ class NSDate extends NSObject implements NSCopying, NSSecureCoding {
2022
2022
2023
2023
/// NSDictionary
2024
2024
class NSDictionary extends NSObject
2025
+ with MapBase<NSCopying, objc.ObjCObjectBase>
2025
2026
implements NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration {
2027
+ /// Creates a [NSDictionary] from [other].
2028
+ static NSDictionary of(Map<NSCopying, objc.ObjCObjectBase> other) =>
2029
+ NSMutableDictionary.of(other);
2030
+
2031
+ @override
2032
+ int get length => count;
2033
+
2034
+ @override
2035
+ objc.ObjCObjectBase? operator [](Object? key) =>
2036
+ key is NSCopying ? objectForKey_(key) : null;
2037
+
2038
+ @override
2039
+ Iterable<NSCopying> get keys => _NSDictionaryKeyIterable(this);
2040
+
2041
+ @override
2042
+ Iterable<objc.ObjCObjectBase> get values => _NSDictionaryValueIterable(this);
2043
+
2044
+ @override
2045
+ bool containsKey(Object? key) => this[key] != null;
2046
+
2047
+ @override
2048
+ void operator []=(NSCopying key, objc.ObjCObjectBase value) =>
2049
+ throw UnsupportedError("Cannot modify NSDictionary");
2050
+
2051
+ @override
2052
+ void clear() => throw UnsupportedError("Cannot modify NSDictionary");
2053
+
2054
+ @override
2055
+ objc.ObjCObjectBase? remove(Object? key) =>
2056
+ throw UnsupportedError("Cannot modify NSDictionary");
2057
+
2026
2058
NSDictionary._(ffi.Pointer<objc.ObjCObject> pointer,
2027
2059
{bool retain = false, bool release = false})
2028
2060
: super.castFromPointer(pointer, retain: retain, release: release);
@@ -2228,7 +2260,20 @@ enum NSEnumerationOptions {
2228
2260
}
2229
2261
2230
2262
/// NSEnumerator
2231
- class NSEnumerator extends NSObject implements NSFastEnumeration {
2263
+ class NSEnumerator extends NSObject
2264
+ implements NSFastEnumeration, Iterator<objc.ObjCObjectBase> {
2265
+ objc.ObjCObjectBase? _current;
2266
+
2267
+ @override
2268
+ objc.ObjCObjectBase get current => _current!;
2269
+
2270
+ @override
2271
+ @pragma('vm:prefer-inline')
2272
+ bool moveNext() {
2273
+ _current = nextObject();
2274
+ return _current != null;
2275
+ }
2276
+
2232
2277
NSEnumerator._(ffi.Pointer<objc.ObjCObject> pointer,
2233
2278
{bool retain = false, bool release = false})
2234
2279
: super.castFromPointer(pointer, retain: retain, release: release);
@@ -4694,7 +4739,7 @@ class NSMethodSignature extends NSObject {
4694
4739
}
4695
4740
4696
4741
/// NSMutableArray
4697
- class NSMutableArray extends NSArray with ListMixin <objc.ObjCObjectBase> {
4742
+ class NSMutableArray extends NSArray with ListBase <objc.ObjCObjectBase> {
4698
4743
/// Creates a [NSMutableArray] of the given length with [fill] at each
4699
4744
/// position.
4700
4745
///
@@ -4716,18 +4761,19 @@ class NSMutableArray extends NSArray with ListMixin<objc.ObjCObjectBase> {
4716
4761
for (; len > newLength; --len) removeLastObject();
4717
4762
}
4718
4763
4764
+ @override
4765
+ Iterator<objc.ObjCObjectBase> get iterator => _NSArrayIterator(this);
4766
+
4767
+ @override
4768
+ objc.ObjCObjectBase operator [](int index) => objectAtIndex_(index);
4769
+
4719
4770
@override
4720
4771
void operator []=(int index, objc.ObjCObjectBase value) =>
4721
4772
replaceObjectAtIndex_withObject_(index, value);
4722
4773
4723
4774
@override
4724
4775
void add(objc.ObjCObjectBase value) => addObject_(value);
4725
4776
4726
- @override
4727
- void addAll(Iterable<objc.ObjCObjectBase> iterable) {
4728
- for (final value in iterable) add(value);
4729
- }
4730
-
4731
4777
NSMutableArray._(ffi.Pointer<objc.ObjCObject> pointer,
4732
4778
{bool retain = false, bool release = false})
4733
4779
: super.castFromPointer(pointer, retain: retain, release: release);
@@ -5339,6 +5385,25 @@ class NSMutableData extends NSData {
5339
5385
5340
5386
/// NSMutableDictionary
5341
5387
class NSMutableDictionary extends NSDictionary {
5388
+ /// Creates a [NSMutableDictionary] from [other].
5389
+ static NSDictionary of(Map<NSCopying, objc.ObjCObjectBase> other) =>
5390
+ NSMutableDictionary.dictionaryWithCapacity_(other.length)..addAll(other);
5391
+
5392
+ @override
5393
+ void clear() => removeAllObjects();
5394
+
5395
+ @override
5396
+ objc.ObjCObjectBase? remove(Object? key) {
5397
+ if (key is! NSCopying) return null;
5398
+ final old = this[key];
5399
+ removeObjectForKey_(key);
5400
+ return old;
5401
+ }
5402
+
5403
+ @override
5404
+ void operator []=(NSCopying key, objc.ObjCObjectBase value) =>
5405
+ setObject_forKey_(value, NSCopying.castFrom(key));
5406
+
5342
5407
NSMutableDictionary._(ffi.Pointer<objc.ObjCObject> pointer,
5343
5408
{bool retain = false, bool release = false})
5344
5409
: super.castFromPointer(pointer, retain: retain, release: release);
@@ -6083,6 +6148,28 @@ class NSMutableOrderedSet extends NSOrderedSet {
6083
6148
6084
6149
/// NSMutableSet
6085
6150
class NSMutableSet extends NSSet {
6151
+ /// Creates a [NSMutableSet] from [elements].
6152
+ static NSMutableSet of(Iterable<objc.ObjCObjectBase> elements) =>
6153
+ setWithCapacity_(elements.length)..addAll(elements);
6154
+
6155
+ @override
6156
+ bool add(objc.ObjCObjectBase value) {
6157
+ final alreadyContains = contains(value);
6158
+ addObject_(value);
6159
+ return !alreadyContains;
6160
+ }
6161
+
6162
+ @override
6163
+ bool remove(Object? value) {
6164
+ if (value is! objc.ObjCObjectBase) return false;
6165
+ final alreadyContains = contains(value);
6166
+ removeObject_(value);
6167
+ return alreadyContains;
6168
+ }
6169
+
6170
+ @override
6171
+ void clear() => removeAllObjects();
6172
+
6086
6173
NSMutableSet._(ffi.Pointer<objc.ObjCObject> pointer,
6087
6174
{bool retain = false, bool release = false})
6088
6175
: super.castFromPointer(pointer, retain: retain, release: release);
@@ -9379,7 +9466,39 @@ interface class NSSecureCoding extends objc.ObjCProtocolBase
9379
9466
9380
9467
/// NSSet
9381
9468
class NSSet extends NSObject
9469
+ with SetBase<objc.ObjCObjectBase>
9382
9470
implements NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration {
9471
+ /// Creates a [NSSet] from [elements].
9472
+ static NSSet of(Iterable<objc.ObjCObjectBase> elements) =>
9473
+ NSMutableSet.of(elements);
9474
+
9475
+ @override
9476
+ int get length => count;
9477
+
9478
+ @override
9479
+ bool contains(Object? element) =>
9480
+ element is objc.ObjCObjectBase ? containsObject_(element) : false;
9481
+
9482
+ @override
9483
+ objc.ObjCObjectBase? lookup(Object? element) =>
9484
+ element is objc.ObjCObjectBase ? member_(element) : null;
9485
+
9486
+ @override
9487
+ Iterator<objc.ObjCObjectBase> get iterator => objectEnumerator();
9488
+
9489
+ @override
9490
+ Set<objc.ObjCObjectBase> toSet() => {...this};
9491
+
9492
+ @override
9493
+ bool add(objc.ObjCObjectBase value) =>
9494
+ throw UnsupportedError("Cannot modify NSSet");
9495
+
9496
+ @override
9497
+ bool remove(Object? value) => throw UnsupportedError("Cannot modify NSSet");
9498
+
9499
+ @override
9500
+ void clear() => throw UnsupportedError("Cannot modify NSSet");
9501
+
9383
9502
NSSet._(ffi.Pointer<objc.ObjCObject> pointer,
9384
9503
{bool retain = false, bool release = false})
9385
9504
: super.castFromPointer(pointer, retain: retain, release: release);
@@ -18498,3 +18617,43 @@ class _NSArrayIterator implements Iterator<objc.ObjCObjectBase> {
18498
18617
return true;
18499
18618
}
18500
18619
}
18620
+
18621
+ class _NSDictionaryKeyIterable with Iterable<NSCopying> {
18622
+ NSDictionary _dictionary;
18623
+
18624
+ _NSDictionaryKeyIterable(this._dictionary);
18625
+
18626
+ @override
18627
+ int get length => _dictionary.length;
18628
+
18629
+ @override
18630
+ Iterator<NSCopying> get iterator =>
18631
+ _NSDictionaryKeyIterator(_dictionary.keyEnumerator());
18632
+
18633
+ @override
18634
+ bool contains(Object? key) => _dictionary.containsKey(key);
18635
+ }
18636
+
18637
+ class _NSDictionaryValueIterable with Iterable<objc.ObjCObjectBase> {
18638
+ NSDictionary _dictionary;
18639
+
18640
+ _NSDictionaryValueIterable(this._dictionary);
18641
+
18642
+ @override
18643
+ int get length => _dictionary.length;
18644
+
18645
+ @override
18646
+ Iterator<objc.ObjCObjectBase> get iterator => _dictionary.objectEnumerator();
18647
+ }
18648
+
18649
+ class _NSDictionaryKeyIterator implements Iterator<NSCopying> {
18650
+ final Iterator<objc.ObjCObjectBase> _iterator;
18651
+ _NSDictionaryKeyIterator(this._iterator);
18652
+
18653
+ @override
18654
+ NSCopying get current => NSCopying.castFrom(_iterator.current);
18655
+
18656
+ @override
18657
+ @pragma('vm:prefer-inline')
18658
+ bool moveNext() => _iterator.moveNext();
18659
+ }
0 commit comments