wip
diff --git a/pkgs/objective_c/ffigen_objc.yaml b/pkgs/objective_c/ffigen_objc.yaml
index 7179dfe..8048c96 100644
--- a/pkgs/objective_c/ffigen_objc.yaml
+++ b/pkgs/objective_c/ffigen_objc.yaml
@@ -200,4 +200,3 @@
   // ignore_for_file: unused_element
   // ignore_for_file: unused_field
   // coverage:ignore-file
-  import 'dart:collection';
diff --git a/pkgs/objective_c/lib/src/converter.dart b/pkgs/objective_c/lib/src/converter.dart
index 6923e53..dbcddb5 100644
--- a/pkgs/objective_c/lib/src/converter.dart
+++ b/pkgs/objective_c/lib/src/converter.dart
@@ -3,12 +3,14 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'internal.dart';
+import 'ns_array.dart';
 import 'ns_date.dart';
+import 'ns_dictionary.dart';
 import 'ns_number.dart';
+import 'ns_set.dart';
 import 'ns_string.dart';
 import 'objective_c_bindings_generated.dart';
 
-/*
 ObjCObjectBase _defaultObjCConverter(Object o) =>
     throw UnimplementedError('No conversion for $o');
 
@@ -116,22 +118,39 @@
 }
 
 extension NSArrayToDartList on NSArray {
+  /// Deep converts this [NSArray] to a Dart [List].
+  ///
+  /// This creates a new [List], converts all the [NSArray] elements, and adds
+  /// them to the [List]. If you only need iteration and element access,
+  /// [toDart] is much more efficient.
   List<Object> toDartList({
     Object Function(ObjCObjectBase) convertOther = _defaultDartConverter,
-  }) => map((o) => toDartObject(o, convertOther: convertOther)).toList();
+  }) =>
+      toDart().map((o) => toDartObject(o, convertOther: convertOther)).toList();
 }
 
 extension NSSetToDartSet on NSSet {
+  /// Deep converts this [NSSet] to a Dart [Set].
+  ///
+  /// This creates a new [Set], converts all the [NSSet] elements, and adds
+  /// them to the [Set]. If you only need iteration and element access,
+  /// [toDart] is much more efficient.
   Set<Object> toDartSet({
     Object Function(ObjCObjectBase) convertOther = _defaultDartConverter,
-  }) => map((o) => toDartObject(o, convertOther: convertOther)).toSet();
+  }) =>
+      toDart().map((o) => toDartObject(o, convertOther: convertOther)).toSet();
 }
 
 extension NSDictionaryToDartMap on NSDictionary {
+  /// Deep converts this [NSDictionary] to a Dart [Map].
+  ///
+  /// This creates a new [Map], converts all the [NSDictionary] elements, and
+  /// adds them to the [Map]. If you only need iteration and element access,
+  /// [toDart] is much more efficient.
   Map<Object, Object> toDartMap({
     Object Function(ObjCObjectBase) convertOther = _defaultDartConverter,
   }) => Map.fromEntries(
-    entries.map(
+    toDart().entries.map(
       (kv) => MapEntry(
         toDartObject(kv.key, convertOther: convertOther),
         toDartObject(kv.value, convertOther: convertOther),
@@ -139,4 +158,3 @@
     ),
   );
 }
-*/
diff --git a/pkgs/objective_c/lib/src/ns_array.dart b/pkgs/objective_c/lib/src/ns_array.dart
index 0f2f731..fc69a6d 100644
--- a/pkgs/objective_c/lib/src/ns_array.dart
+++ b/pkgs/objective_c/lib/src/ns_array.dart
@@ -4,58 +4,87 @@
 
 import 'dart:collection';
 
-import 'package:ffi/ffi.dart';
-
+import 'converter.dart';
 import 'internal.dart';
 import 'objective_c_bindings_generated.dart';
 
-class NSArrayAdapter with Iterable<ObjCObjectBase> {
-  final NSArray array;
+class _NSArrayAdapter with ListBase<ObjCObjectBase> {
+  final NSArray _array;
 
-  NSArrayAdapter(this.array);
+  _NSArrayAdapter(this._array);
 
   @override
-  int get length => array.count;
+  int get length => _array.count;
 
   @override
-  ObjCObjectBase elementAt(int index) => array.objectAtIndex(index);
+  ObjCObjectBase elementAt(int index) => _array.objectAtIndex(index);
 
   @override
   Iterator<ObjCObjectBase> get iterator => _NSArrayIterator(this);
 
-  ObjCObjectBase operator [](int index) => array.objectAtIndex(index);
-}
-
-class NSMutableArrayAdapter with ListBase<ObjCObjectBase> {
-  final NSMutableArray array;
-
-  NSMutableArrayAdapter(this.array);
+  @override
+  ObjCObjectBase operator [](int index) => _array.objectAtIndex(index);
 
   @override
-  int get length => array.count;
+  set length(int newLength) => throw UnsupportedError('Cannot modify NSArray');
+
+  @override
+  void operator []=(int index, ObjCObjectBase value) =>
+      throw UnsupportedError('Cannot modify NSArray');
+
+  @override
+  void add(ObjCObjectBase value) =>
+      throw UnsupportedError('Cannot modify NSArray');
+}
+
+extension NSArrayToAdapter on NSArray {
+  /// Wraps this [NSArray] in an adapter that implements an immutable [List].
+  ///
+  /// This is not a conversion, doesn't create a new list, or change the
+  /// elements. For deep conversion, use [toDartList].
+  List<ObjCObjectBase> toDart() => _NSArrayAdapter(this);
+}
+
+class _NSMutableArrayAdapter with ListBase<ObjCObjectBase> {
+  final NSMutableArray _array;
+
+  _NSMutableArrayAdapter(this._array);
+
+  @override
+  int get length => _array.count;
 
   @override
   set length(int newLength) {
     var len = length;
     RangeError.checkValueInInterval(newLength, 0, len);
-    for (; len > newLength; --len) array.removeLastObject();
+    for (; len > newLength; --len) {
+      _array.removeLastObject();
+    }
   }
 
   @override
-  ObjCObjectBase elementAt(int index) => array.objectAtIndex(index);
+  ObjCObjectBase elementAt(int index) => _array.objectAtIndex(index);
 
   @override
   Iterator<ObjCObjectBase> get iterator => _NSArrayIterator(this);
 
   @override
-  ObjCObjectBase operator [](int index) => array.objectAtIndex(index);
+  ObjCObjectBase operator [](int index) => _array.objectAtIndex(index);
 
   @override
   void operator []=(int index, ObjCObjectBase value) =>
-      array.replaceObjectAtIndex(index, withObject: value);
+      _array.replaceObjectAtIndex(index, withObject: value);
 
   @override
-  void add(ObjCObjectBase value) => array.addObject(value);
+  void add(ObjCObjectBase value) => _array.addObject(value);
+}
+
+extension NSMutableArrayToAdapter on NSMutableArray {
+  /// Wraps this [NSMutableArray] in an adapter that implements [List].
+  ///
+  /// This is not a conversion, doesn't create a new list, or change the
+  /// elements. For deep conversion, use [toDartList].
+  List<ObjCObjectBase> toDart() => _NSMutableArrayAdapter(this);
 }
 
 class _NSArrayIterator implements Iterator<ObjCObjectBase> {
diff --git a/pkgs/objective_c/lib/src/ns_dictionary.dart b/pkgs/objective_c/lib/src/ns_dictionary.dart
index a52106d..f929078 100644
--- a/pkgs/objective_c/lib/src/ns_dictionary.dart
+++ b/pkgs/objective_c/lib/src/ns_dictionary.dart
@@ -4,8 +4,7 @@
 
 import 'dart:collection';
 
-import 'package:ffi/ffi.dart';
-
+import 'converter.dart';
 import 'internal.dart';
 import 'ns_enumerator.dart';
 import 'objective_c_bindings_generated.dart';
@@ -13,17 +12,17 @@
 // Ideally we'd mixin UnmodifiableMapBase, but it's an ordinary class. So
 // instead we mixin MapBase and then throw in all the modifying methods (which
 // is essentially what UnmodifiableMapBase does anyway).
-class NSDictionaryAdapter with MapBase<NSCopying, ObjCObjectBase> {
-  final NSDictionary dictionary;
+class _NSDictionaryAdapter with MapBase<NSCopying, ObjCObjectBase> {
+  final NSDictionary _dictionary;
 
-  NSDictionaryAdapter(this.dictionary);
+  _NSDictionaryAdapter(this._dictionary);
 
   @override
-  int get length => dictionary.count;
+  int get length => _dictionary.count;
 
   @override
   ObjCObjectBase? operator [](Object? key) =>
-      key is NSCopying ? dictionary.objectForKey(key) : null;
+      key is NSCopying ? _dictionary.objectForKey(key) : null;
 
   @override
   Iterable<NSCopying> get keys => _NSDictionaryKeyIterable(this);
@@ -36,69 +35,87 @@
 
   @override
   void operator []=(NSCopying key, ObjCObjectBase value) =>
-      throw UnsupportedError("Cannot modify NSDictionary");
+      throw UnsupportedError('Cannot modify NSDictionary');
 
   @override
-  void clear() => throw UnsupportedError("Cannot modify NSDictionary");
+  void clear() => throw UnsupportedError('Cannot modify NSDictionary');
 
   @override
   ObjCObjectBase? remove(Object? key) =>
-      throw UnsupportedError("Cannot modify NSDictionary");
+      throw UnsupportedError('Cannot modify NSDictionary');
 }
 
-class NSMutableDictionaryAdapter with MapBase<NSCopying, ObjCObjectBase> {
-  final NSMutableDictionary dictionary;
+extension NSDictionaryToAdapter on NSDictionary {
+  /// Wraps this [NSDictionary] in an adapter that implements an immutable
+  /// [Map].
+  ///
+  /// This is not a conversion, doesn't create a new map, or change the
+  /// elements. For deep conversion, use [toDartMap].
+  Map<NSCopying, ObjCObjectBase> toDart() => _NSDictionaryAdapter(this);
+}
 
-  NSMutableDictionaryAdapter(this.dictionary);
+class _NSMutableDictionaryAdapter with MapBase<NSCopying, ObjCObjectBase> {
+  final NSMutableDictionary _dictionary;
+
+  _NSMutableDictionaryAdapter(this._dictionary);
 
   @override
-  int get length => dictionary.count;
+  int get length => _dictionary.count;
 
   @override
   ObjCObjectBase? operator [](Object? key) =>
-      key is NSCopying ? dictionary.objectForKey(key) : null;
+      key is NSCopying ? _dictionary.objectForKey(key) : null;
 
   @override
   void operator []=(NSCopying key, ObjCObjectBase value) =>
       NSMutableDictionary$Methods(
-        dictionary,
+        _dictionary,
       ).setObject(value, forKey: NSCopying.castFrom(key));
 
   @override
-  Iterable<NSCopying> get keys => NSDictionaryAdapter(dictionary).keys;
+  Iterable<NSCopying> get keys => _NSDictionaryAdapter(_dictionary).keys;
 
   @override
-  Iterable<ObjCObjectBase> get values => NSDictionaryAdapter(dictionary).values;
+  Iterable<ObjCObjectBase> get values =>
+      _NSDictionaryAdapter(_dictionary).values;
 
   @override
   bool containsKey(Object? key) => this[key] != null;
 
   @override
-  void clear() => dictionary.removeAllObjects();
+  void clear() => _dictionary.removeAllObjects();
 
   @override
   ObjCObjectBase? remove(Object? key) {
     if (key is! NSCopying) return null;
     final old = this[key];
-    dictionary.removeObjectForKey(key);
+    _dictionary.removeObjectForKey(key);
     return old;
   }
 }
 
-class _NSDictionaryKeyIterable with Iterable<NSCopying> {
-  NSDictionaryAdapter _dictionary;
+extension NSMutableDictionaryToAdapter on NSMutableDictionary {
+  /// Wraps this [NSMutableDictionary] in an adapter that implements [Map].
+  ///
+  /// This is not a conversion, doesn't create a new map, or change the
+  /// elements. For deep conversion, use [toDartMap].
+  Map<NSCopying, ObjCObjectBase> toDart() => _NSMutableDictionaryAdapter(this);
+}
 
-  _NSDictionaryKeyIterable(this._dictionary);
+class _NSDictionaryKeyIterable with Iterable<NSCopying> {
+  final _NSDictionaryAdapter _adapter;
+
+  _NSDictionaryKeyIterable(this._adapter);
 
   @override
-  int get length => _dictionary.length;
+  int get length => _adapter.length;
 
   @override
   Iterator<NSCopying> get iterator =>
-      _NSDictionaryKeyIterator(_dictionary.dictionary.keyEnumerator().toDart());
+      _NSDictionaryKeyIterator(_adapter._dictionary.keyEnumerator().toDart());
 
   @override
-  bool contains(Object? key) => _dictionary.containsKey(key);
+  bool contains(Object? key) => _adapter.containsKey(key);
 }
 
 class _NSDictionaryKeyIterator implements Iterator<NSCopying> {
@@ -115,14 +132,14 @@
 }
 
 class _NSDictionaryValueIterable with Iterable<ObjCObjectBase> {
-  NSDictionaryAdapter _dictionary;
+  final _NSDictionaryAdapter _adapter;
 
-  _NSDictionaryValueIterable(this._dictionary);
+  _NSDictionaryValueIterable(this._adapter);
 
   @override
-  int get length => _dictionary.length;
+  int get length => _adapter.length;
 
   @override
   Iterator<ObjCObjectBase> get iterator =>
-      _dictionary.dictionary.objectEnumerator().toDart();
+      _adapter._dictionary.objectEnumerator().toDart();
 }
diff --git a/pkgs/objective_c/lib/src/ns_enumerator.dart b/pkgs/objective_c/lib/src/ns_enumerator.dart
index 7eb031b..29567d4 100644
--- a/pkgs/objective_c/lib/src/ns_enumerator.dart
+++ b/pkgs/objective_c/lib/src/ns_enumerator.dart
@@ -2,16 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:ffi/ffi.dart';
-
 import 'internal.dart';
 import 'objective_c_bindings_generated.dart';
 
-class NSEnumeratorAdapter implements Iterator<ObjCObjectBase> {
+class _NSEnumeratorAdapter implements Iterator<ObjCObjectBase> {
   final NSEnumerator enumerator;
   ObjCObjectBase? _current;
 
-  NSEnumeratorAdapter(this.enumerator);
+  _NSEnumeratorAdapter(this.enumerator);
 
   @override
   ObjCObjectBase get current => _current!;
@@ -23,3 +21,8 @@
     return _current != null;
   }
 }
+
+extension NSEnumeratorToAdapter on NSEnumerator {
+  /// Wraps this [NSEnumerator] in an adapter that implements [Iterator].
+  Iterator<ObjCObjectBase> toDart() => _NSEnumeratorAdapter(this);
+}
diff --git a/pkgs/objective_c/lib/src/ns_set.dart b/pkgs/objective_c/lib/src/ns_set.dart
index 4908837..7c62a37 100644
--- a/pkgs/objective_c/lib/src/ns_set.dart
+++ b/pkgs/objective_c/lib/src/ns_set.dart
@@ -4,63 +4,70 @@
 
 import 'dart:collection';
 
-import 'package:ffi/ffi.dart';
-
+import 'converter.dart';
 import 'internal.dart';
 import 'ns_enumerator.dart';
 import 'objective_c_bindings_generated.dart';
 
-class NSSetAdapter with SetBase<ObjCObjectBase> {
-  NSSet set;
+class _NSSetAdapter with SetBase<ObjCObjectBase> {
+  final NSSet _set;
 
-  NSSetAdapter(this.set);
+  _NSSetAdapter(this._set);
 
   @override
-  int get length => set.count;
+  int get length => _set.count;
 
   @override
   bool contains(Object? element) =>
-      element is ObjCObjectBase ? set.containsObject(element) : false;
+      element is ObjCObjectBase ? _set.containsObject(element) : false;
 
   @override
   ObjCObjectBase? lookup(Object? element) =>
-      element is ObjCObjectBase ? set.member(element) : null;
+      element is ObjCObjectBase ? _set.member(element) : null;
 
   @override
-  Iterator<ObjCObjectBase> get iterator => set.objectEnumerator().toDart();
+  Iterator<ObjCObjectBase> get iterator => _set.objectEnumerator().toDart();
 
   @override
   Set<ObjCObjectBase> toSet() => {...this};
 
   @override
   bool add(ObjCObjectBase value) =>
-      throw UnsupportedError("Cannot modify NSSet");
+      throw UnsupportedError('Cannot modify NSSet');
 
   @override
-  bool remove(Object? value) => throw UnsupportedError("Cannot modify NSSet");
+  bool remove(Object? value) => throw UnsupportedError('Cannot modify NSSet');
 
   @override
-  void clear() => throw UnsupportedError("Cannot modify NSSet");
+  void clear() => throw UnsupportedError('Cannot modify NSSet');
 }
 
-class NSMutableSetAdapter with SetBase<ObjCObjectBase> {
-  NSMutableSet set;
+extension NSSetToAdapter on NSSet {
+  /// Wraps this [NSSet] in an adapter that implements an immutable [Set].
+  ///
+  /// This is not a conversion, doesn't create a new set, or change the
+  /// elements. For deep conversion, use [toDartSet].
+  Set<ObjCObjectBase> toDart() => _NSSetAdapter(this);
+}
 
-  NSMutableSetAdapter(this.set);
+class _NSMutableSetAdapter with SetBase<ObjCObjectBase> {
+  final NSMutableSet _set;
+
+  _NSMutableSetAdapter(this._set);
 
   @override
-  int get length => set.count;
+  int get length => _set.count;
 
   @override
   bool contains(Object? element) =>
-      element is ObjCObjectBase ? set.containsObject(element) : false;
+      element is ObjCObjectBase ? _set.containsObject(element) : false;
 
   @override
   ObjCObjectBase? lookup(Object? element) =>
-      element is ObjCObjectBase ? set.member(element) : null;
+      element is ObjCObjectBase ? _set.member(element) : null;
 
   @override
-  Iterator<ObjCObjectBase> get iterator => set.objectEnumerator().toDart();
+  Iterator<ObjCObjectBase> get iterator => _set.objectEnumerator().toDart();
 
   @override
   Set<ObjCObjectBase> toSet() => {...this};
@@ -68,7 +75,7 @@
   @override
   bool add(ObjCObjectBase value) {
     final alreadyContains = contains(value);
-    set.addObject(value);
+    _set.addObject(value);
     return !alreadyContains;
   }
 
@@ -76,10 +83,18 @@
   bool remove(Object? value) {
     if (value is! ObjCObjectBase) return false;
     final alreadyContains = contains(value);
-    set.removeObject(value);
+    _set.removeObject(value);
     return alreadyContains;
   }
 
   @override
-  void clear() => set.removeAllObjects();
+  void clear() => _set.removeAllObjects();
+}
+
+extension NSMutableSetToAdapter on NSMutableSet {
+  /// Wraps this [NSMutableSet] in an adapter that implements [Set].
+  ///
+  /// This is not a conversion, doesn't create a new set, or change the
+  /// elements. For deep conversion, use [toDartSet].
+  Set<ObjCObjectBase> toDart() => _NSMutableSetAdapter(this);
 }
diff --git a/pkgs/objective_c/lib/src/objective_c_bindings_generated.dart b/pkgs/objective_c/lib/src/objective_c_bindings_generated.dart
index 4bcc911..863d286 100644
--- a/pkgs/objective_c/lib/src/objective_c_bindings_generated.dart
+++ b/pkgs/objective_c/lib/src/objective_c_bindings_generated.dart
@@ -12,7 +12,6 @@
 // ignore_for_file: unused_element
 // ignore_for_file: unused_field
 // coverage:ignore-file
-import 'dart:collection';
 
 // AUTO GENERATED FILE, DO NOT EDIT.
 //
@@ -1519,9 +1518,6 @@
   static NSArray of(Iterable<objc.ObjCObjectBase> elements) =>
       NSMutableArray.of(elements);
 
-  /// Wraps this [NSArray] in an adapter that implements [Iterable].
-  objc.NSArrayAdapter toDart() => objc.NSArrayAdapter(this);
-
   /// Constructs a [NSArray] that wraps the given raw object pointer.
   NSArray.castFromPointer(
     ffi.Pointer<objc.ObjCObject> other, {
@@ -4892,9 +4888,6 @@
     Iterable<MapEntry<NSCopying, objc.ObjCObjectBase>> entries,
   ) => NSMutableDictionary.fromEntries(entries);
 
-  /// Wraps this [NSDictionary] in an adapter that implements [Map].
-  objc.NSDictionaryAdapter toDart() => objc.NSDictionaryAdapter(this);
-
   /// Constructs a [NSDictionary] that wraps the given raw object pointer.
   NSDictionary.castFromPointer(
     ffi.Pointer<objc.ObjCObject> other, {
@@ -5172,9 +5165,6 @@
 /// NSEnumerator
 extension type NSEnumerator.castFrom(objc.ObjCObjectBase _$)
     implements objc.ObjCObjectBase, NSObject, NSFastEnumeration {
-  /// Wraps this [NSEnumerator] in an adapter that implements [Iterator].
-  objc.NSEnumeratorAdapter toDart() => objc.NSEnumeratorAdapter(this);
-
   /// Constructs a [NSEnumerator] that wraps the given raw object pointer.
   NSEnumerator.castFromPointer(
     ffi.Pointer<objc.ObjCObject> other, {
@@ -10394,9 +10384,6 @@
     return a;
   }
 
-  /// Wraps this [NSMutableArray] in an adapter that implements [List].
-  objc.NSMutableArrayAdapter toDart() => objc.NSMutableArrayAdapter(this);
-
   /// Constructs a [NSMutableArray] that wraps the given raw object pointer.
   NSMutableArray.castFromPointer(
     ffi.Pointer<objc.ObjCObject> other, {
@@ -11243,10 +11230,6 @@
     return dict;
   }
 
-  /// Wraps this [NSMutableDictionary] in an adapter that implements [Map].
-  objc.NSMutableDictionaryAdapter toDart() =>
-      objc.NSMutableDictionaryAdapter(this);
-
   /// Constructs a [NSMutableDictionary] that wraps the given raw object pointer.
   NSMutableDictionary.castFromPointer(
     ffi.Pointer<objc.ObjCObject> other, {
@@ -12433,9 +12416,6 @@
     return set;
   }
 
-  /// Wraps this [NSMutableSet] in an adapter that implements [Set].
-  objc.NSMutableSetAdapter toDart() => objc.NSMutableSetAdapter(this);
-
   /// Constructs a [NSMutableSet] that wraps the given raw object pointer.
   NSMutableSet.castFromPointer(
     ffi.Pointer<objc.ObjCObject> other, {
@@ -18698,9 +18678,6 @@
   static NSSet of(Iterable<objc.ObjCObjectBase> elements) =>
       NSMutableSet.of(elements);
 
-  /// Wraps this [NSSet] in an adapter that implements [Set].
-  objc.NSSetAdapter toDart() => objc.NSSetAdapter(this);
-
   /// Constructs a [NSSet] that wraps the given raw object pointer.
   NSSet.castFromPointer(
     ffi.Pointer<objc.ObjCObject> other, {
diff --git a/pkgs/objective_c/test/converter_test.dart b/pkgs/objective_c/test/converter_test.dart
index 32cb6f9..7bc5d7b 100644
--- a/pkgs/objective_c/test/converter_test.dart
+++ b/pkgs/objective_c/test/converter_test.dart
@@ -53,12 +53,12 @@
       final dartList = [123, 'abc', obj];
 
       expect(toObjCObject(dartList), isA<NSArray>());
-      final objCList = toObjCObject(dartList) as NSArray;
-      expect(objCList.length, 3);
+      final objCList = NSArray.castFrom(toObjCObject(dartList));
+      expect(objCList.toDart().length, 3);
 
-      expect(toDartObject(objCList[0]), 123);
-      expect(toDartObject(objCList[1]), 'abc');
-      expect(toDartObject(objCList[2]), obj);
+      expect(toDartObject(objCList.toDart()[0]), 123);
+      expect(toDartObject(objCList.toDart()[1]), 'abc');
+      expect(toDartObject(objCList.toDart()[2]), obj);
 
       expect(toDartObject(objCList), dartList);
 
@@ -79,12 +79,12 @@
       final dartSet = {123, 'abc', obj};
 
       expect(toObjCObject(dartSet), isA<NSSet>());
-      final objCSet = toObjCObject(dartSet) as NSSet;
-      expect(objCSet.length, 3);
+      final objCSet = NSSet.castFrom(toObjCObject(dartSet));
+      expect(objCSet.toDart().length, 3);
 
-      expect(objCSet.contains(toObjCObject(123)), isTrue);
-      expect(objCSet.contains(toObjCObject('abc')), isTrue);
-      expect(objCSet.contains(toObjCObject(obj)), isTrue);
+      expect(objCSet.toDart().contains(toObjCObject(123)), isTrue);
+      expect(objCSet.toDart().contains(toObjCObject('abc')), isTrue);
+      expect(objCSet.toDart().contains(toObjCObject(obj)), isTrue);
 
       expect(toDartObject(objCSet), dartSet);
 
@@ -105,12 +105,12 @@
       final dartMap = {123: 'abc', 'def': 456, 789: obj};
 
       expect(toObjCObject(dartMap), isA<NSDictionary>());
-      final objCMap = toObjCObject(dartMap) as NSDictionary;
-      expect(objCMap.length, 3);
+      final objCMap = NSDictionary.castFrom(toObjCObject(dartMap));
+      expect(objCMap.toDart().length, 3);
 
-      expect(toDartObject(objCMap[toObjCObject(123)]!), 'abc');
-      expect(toDartObject(objCMap[toObjCObject('def')]!), 456);
-      expect(toDartObject(objCMap[toObjCObject(789)]!), obj);
+      expect(toDartObject(objCMap.toDart()[toObjCObject(123)]!), 'abc');
+      expect(toDartObject(objCMap.toDart()[toObjCObject('def')]!), 456);
+      expect(toDartObject(objCMap.toDart()[toObjCObject(789)]!), obj);
 
       expect(toDartObject(objCMap), dartMap);
 
diff --git a/pkgs/objective_c/test/observer_test.dart b/pkgs/objective_c/test/observer_test.dart
index 03116dd..cd74c5e 100644
--- a/pkgs/objective_c/test/observer_test.dart
+++ b/pkgs/objective_c/test/observer_test.dart
@@ -39,7 +39,9 @@
               expect(keyPath.toDartString(), 'totalUnitCount');
               expect(object, observed);
               expect(context.address, 0x1234);
-              values.add(toDartObject(change[NSKeyValueChangeNewKey]!));
+              values.add(
+                toDartObject(change.toDart()[NSKeyValueChangeNewKey]!),
+              );
             },
       );
       final observation = observed.addObserver(
@@ -77,7 +79,9 @@
               NSDictionary change,
               Pointer<Void> context,
             ) {
-              values.add(toDartObject(change[NSKeyValueChangeNewKey]!));
+              values.add(
+                toDartObject(change.toDart()[NSKeyValueChangeNewKey]!),
+              );
             },
       );
 
@@ -116,7 +120,9 @@
                 NSDictionary change,
                 Pointer<Void> context,
               ) {
-                values.add(toDartObject(change[NSKeyValueChangeNewKey]!));
+                values.add(
+                  toDartObject(change.toDart()[NSKeyValueChangeNewKey]!),
+                );
 
                 // This is testing that a captured reference from the observer
                 // to the observed object does not cause leak.
diff --git a/pkgs/objective_c/test/setup.dart b/pkgs/objective_c/test/setup.dart
index 2dc7afb..a7ae84d 100644
--- a/pkgs/objective_c/test/setup.dart
+++ b/pkgs/objective_c/test/setup.dart
@@ -95,9 +95,9 @@
   lib.lookup('_ObjectiveCBindings_wrapListenerBlock_ovsamd');
 
   // Sanity check that the executable can find FFI symbols.
-  // _linkMain([...objFiles, cMain], '$cMain.exe');
-  // final result = Process.runSync('$cMain.exe', []);
-  // if (result.exitCode != 0) {
-  //   throw Exception('Missing symbols from executable:\n${result.stderr}');
-  // }
+  _linkMain([...objFiles, cMain], '$cMain.exe');
+  final result = Process.runSync('$cMain.exe', []);
+  if (result.exitCode != 0) {
+    throw Exception('Missing symbols from executable:\n${result.stderr}');
+  }
 }
diff --git a/pkgs/objective_c/tool/data/extra_methods.dart.in b/pkgs/objective_c/tool/data/extra_methods.dart.in
index 2d0c158..1ed9658 100644
--- a/pkgs/objective_c/tool/data/extra_methods.dart.in
+++ b/pkgs/objective_c/tool/data/extra_methods.dart.in
@@ -32,9 +32,6 @@
   /// Creates a [NSArray] from [elements].
   static NSArray of(Iterable<objc.ObjCObjectBase> elements) =>
       NSMutableArray.of(elements);
-
-  /// Wraps this [NSArray] in an adapter that implements [Iterable].
-  objc.NSArrayAdapter toDart() => objc.NSArrayAdapter(this);
 }
 
 extension type NSMutableArray.castFrom(objc.ObjCObjectBase _$) {
@@ -54,9 +51,6 @@
     for (final e in elements) a.addObject(e);
     return a;
   }
-
-  /// Wraps this [NSMutableArray] in an adapter that implements [List].
-  objc.NSMutableArrayAdapter toDart() => objc.NSMutableArrayAdapter(this);
 }
 
 extension type NSDictionary.castFrom(objc.ObjCObjectBase _$) {
@@ -68,9 +62,6 @@
   static NSDictionary fromEntries(
     Iterable<MapEntry<NSCopying, objc.ObjCObjectBase>> entries,
   ) => NSMutableDictionary.fromEntries(entries);
-
-  /// Wraps this [NSDictionary] in an adapter that implements [Map].
-  objc.NSDictionaryAdapter toDart() => objc.NSDictionaryAdapter(this);
 }
 
 extension type NSMutableDictionary.castFrom(objc.ObjCObjectBase _$) {
@@ -91,24 +82,12 @@
     }
     return dict;
   }
-
-  /// Wraps this [NSMutableDictionary] in an adapter that implements [Map].
-  objc.NSMutableDictionaryAdapter toDart() =>
-      objc.NSMutableDictionaryAdapter(this);
-}
-
-extension type NSEnumerator.castFrom(objc.ObjCObjectBase _$) {
-  /// Wraps this [NSEnumerator] in an adapter that implements [Iterator].
-  objc.NSEnumeratorAdapter toDart() => objc.NSEnumeratorAdapter(this);
 }
 
 extension type NSSet.castFrom(objc.ObjCObjectBase _$) {
   /// Creates a [NSSet] from [elements].
   static NSSet of(Iterable<objc.ObjCObjectBase> elements) =>
       NSMutableSet.of(elements);
-
-  /// Wraps this [NSSet] in an adapter that implements [Set].
-  objc.NSSetAdapter toDart() => objc.NSSetAdapter(this);
 }
 
 extension type NSMutableSet.castFrom(objc.ObjCObjectBase _$) {
@@ -118,7 +97,4 @@
     for (final e in elements) set.addObject(e);
     return set;
   }
-
-  /// Wraps this [NSMutableSet] in an adapter that implements [Set].
-  objc.NSMutableSetAdapter toDart() => objc.NSMutableSetAdapter(this);
 }
diff --git a/pkgs/objective_c/tool/generate_code.dart b/pkgs/objective_c/tool/generate_code.dart
index e6de8b4..78e7bb4 100644
--- a/pkgs/objective_c/tool/generate_code.dart
+++ b/pkgs/objective_c/tool/generate_code.dart
@@ -82,7 +82,7 @@
       extraMethods.remove(cls);
     }
   }
-  assert(extraMethods.length == 0);
+  assert(extraMethods.isEmpty);
 
   File(filename).writeAsStringSync(out.toString());
 }