From d095f754712637cdc65c1d31f4ead4514ecd2fd8 Mon Sep 17 00:00:00 2001 From: Alex Soto Date: Thu, 25 Jul 2019 05:56:39 -0400 Subject: [PATCH] [registrar] Fix a generics type issue with dynamic registrar (#6646) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [registrar] Fix a generics type issue with dynamic registrar Fixes xamarin/xamarin-macios#6567 This Fixes an issue in the registrar where the dynamic registrar misses a case to check for a NSObject constraint triggered by UIKit's `NSDiffableDataSourceSnapshot` object. This also enables the rest of missing bindings in UIKit for Xcode 11 B4 which also works as a test case for the registrar fix. Without this fix introspection test would throw an `AggregateException` and also includes `NSDiffableDataSourceSnapshotTest` to check that the created objects are usable. * Check for Xcode 11 in tests * Exclude the macOS in our UIKit tests ツ --- src/ObjCRuntime/DynamicRegistrar.cs | 15 +- src/uikit.cs | 225 +++++++++--------- .../UIKit/NSDiffableDataSourceSnapshotTest.cs | 52 ++++ tests/xtro-sharpie/iOS-UIKit.todo | 44 ---- tests/xtro-sharpie/tvOS-UIKit.todo | 44 ---- 5 files changed, 177 insertions(+), 203 deletions(-) create mode 100644 tests/monotouch-test/UIKit/NSDiffableDataSourceSnapshotTest.cs diff --git a/src/ObjCRuntime/DynamicRegistrar.cs b/src/ObjCRuntime/DynamicRegistrar.cs index cb81a53f5b..cb08363b17 100644 --- a/src/ObjCRuntime/DynamicRegistrar.cs +++ b/src/ObjCRuntime/DynamicRegistrar.cs @@ -500,7 +500,20 @@ namespace Registrar { constrs [i] = constr; } constrained_type = type.MakeGenericType (constrs); - return true; + return rv; + } + + if (type.IsGenericType) { + var rv = true; + var args = type.GetGenericArguments (); + var constrs = new Type [args.Length]; + for (int i = 0; i < args.Length; i++) { + Type constr; + rv &= VerifyIsConstrainedToNSObject (args [i], out constr); + constrs [i] = constr; + } + constrained_type = type.GetGenericTypeDefinition ().MakeGenericType (constrs); + return rv; } return false; diff --git a/src/uikit.cs b/src/uikit.cs index 44e96bd5f2..d43abe2e8d 100644 --- a/src/uikit.cs +++ b/src/uikit.cs @@ -21163,163 +21163,160 @@ namespace UIKit { UITabBarItemStateAppearance Focused { get; } } - // TODO: The following break the registrar: - // https://github.com/xamarin/xamarin-macios/issues/6567 + [NoWatch, TV (13,0), iOS (13,0)] + [BaseType (typeof (NSObject))] + interface NSDiffableDataSourceSnapshot : NSCopying + where SectionIdentifierType : NSObject + where ItemIdentifierType : NSObject { - // [Watch (6,0), TV (13,0), iOS (13,0)] - // [BaseType (typeof (NSObject))] - // interface NSDiffableDataSourceSnapshot : NSCopying - // where SectionIdentifierType : NSObject - // where ItemIdentifierType : NSObject { + [Export ("numberOfItems")] + nint NumberOfItems { get; } - // [Export ("numberOfItems")] - // nint NumberOfItems { get; } + [Export ("numberOfSections")] + nint NumberOfSections { get; } - // [Export ("numberOfSections")] - // nint NumberOfSections { get; } + [Export ("sectionIdentifiers")] + SectionIdentifierType [] SectionIdentifiers { get; } - // [Export ("sectionIdentifiers")] - // SectionIdentifierType [] SectionIdentifiers { get; } + [Export ("itemIdentifiers")] + ItemIdentifierType [] ItemIdentifiers { get; } - // [Export ("itemIdentifiers")] - // ItemIdentifierType [] ItemIdentifiers { get; } + [Export ("numberOfItemsInSection:")] + nint GetNumberOfItems (SectionIdentifierType sectionIdentifier); - // [Export ("numberOfItemsInSection:")] - // nint GetNumberOfItems (SectionIdentifierType sectionIdentifier); + [Export ("itemIdentifiersInSectionWithIdentifier:")] + ItemIdentifierType [] GetItemIdentifiersInSection (SectionIdentifierType sectionIdentifier); - // [Export ("itemIdentifiersInSectionWithIdentifier:")] - // ItemIdentifierType [] GetItemIdentifiersInSection (SectionIdentifierType sectionIdentifier); + [Export ("sectionIdentifierForSectionContainingItemIdentifier:")] + [return: NullAllowed] + SectionIdentifierType GetSectionIdentifierForSection (ItemIdentifierType itemIdentifier); - // [Export ("sectionIdentifierForSectionContainingItemIdentifier:")] - // [return: NullAllowed] - // SectionIdentifierType GetSectionIdentifierForSection (ItemIdentifierType itemIdentifier); + [Export ("indexOfItemIdentifier:")] + nint GetIndex (ItemIdentifierType itemIdentifier); - // [Export ("indexOfItemIdentifier:")] - // nint GetIndex (ItemIdentifierType itemIdentifier); + [Export ("indexOfSectionIdentifier:")] + nint GetIndex (SectionIdentifierType sectionIdentifier); - // [Export ("indexOfSectionIdentifier:")] - // nint GetIndex (SectionIdentifierType sectionIdentifier); + [Export ("appendItemsWithIdentifiers:")] + void AppendItems (ItemIdentifierType [] identifiers); - // [Export ("appendItemsWithIdentifiers:")] - // void AppendItems (ItemIdentifierType [] identifiers); + [Export ("appendItemsWithIdentifiers:intoSectionWithIdentifier:")] + void AppendItems (ItemIdentifierType [] identifiers, SectionIdentifierType sectionIdentifier); - // [Export ("appendItemsWithIdentifiers:intoSectionWithIdentifier:")] - // void AppendItems (ItemIdentifierType [] identifiers, SectionIdentifierType sectionIdentifier); + [Export ("insertItemsWithIdentifiers:beforeItemWithIdentifier:")] + void InsertItemsBefore (ItemIdentifierType [] identifiers, ItemIdentifierType itemIdentifier); - // [Export ("insertItemsWithIdentifiers:beforeItemWithIdentifier:")] - // void InsertItemsBefore (ItemIdentifierType [] identifiers, ItemIdentifierType itemIdentifier); + [Export ("insertItemsWithIdentifiers:afterItemWithIdentifier:")] + void InsertItemsAfter (ItemIdentifierType [] identifiers, ItemIdentifierType itemIdentifier); - // [Export ("insertItemsWithIdentifiers:afterItemWithIdentifier:")] - // void InsertItemsAfter (ItemIdentifierType [] identifiers, ItemIdentifierType itemIdentifier); + [Export ("deleteItemsWithIdentifiers:")] + void DeleteItems (ItemIdentifierType [] identifiers); - // [Export ("deleteItemsWithIdentifiers:")] - // void DeleteItems (ItemIdentifierType [] identifiers); + [Export ("deleteAllItems")] + void DeleteAllItems (); - // [Export ("deleteAllItems")] - // void DeleteAllItems (); + [Export ("moveItemWithIdentifier:beforeItemWithIdentifier:")] + void MoveItemBefore (ItemIdentifierType fromIdentifier, ItemIdentifierType toIdentifier); - // [Export ("moveItemWithIdentifier:beforeItemWithIdentifier:")] - // void MoveItemBefore (ItemIdentifierType fromIdentifier, ItemIdentifierType toIdentifier); + [Export ("moveItemWithIdentifier:afterItemWithIdentifier:")] + void MoveItemAfter (ItemIdentifierType fromIdentifier, ItemIdentifierType toIdentifier); - // [Export ("moveItemWithIdentifier:afterItemWithIdentifier:")] - // void MoveItemAfter (ItemIdentifierType fromIdentifier, ItemIdentifierType toIdentifier); + [Export ("reloadItemsWithIdentifiers:")] + void ReloadItems (ItemIdentifierType [] identifiers); - // [Export ("reloadItemsWithIdentifiers:")] - // void ReloadItems (ItemIdentifierType [] identifiers); + [Export ("appendSectionsWithIdentifiers:")] + void AppendSections (SectionIdentifierType [] sectionIdentifiers); - // [Export ("appendSectionsWithIdentifiers:")] - // void AppendSections (SectionIdentifierType [] sectionIdentifiers); + [Export ("insertSectionsWithIdentifiers:beforeSectionWithIdentifier:")] + void InsertSectionsBefore (SectionIdentifierType [] sectionIdentifiers, SectionIdentifierType toSectionIdentifier); - // [Export ("insertSectionsWithIdentifiers:beforeSectionWithIdentifier:")] - // void InsertSectionsBefore (SectionIdentifierType [] sectionIdentifiers, SectionIdentifierType toSectionIdentifier); + [Export ("insertSectionsWithIdentifiers:afterSectionWithIdentifier:")] + void InsertSectionsAfter (SectionIdentifierType [] sectionIdentifiers, SectionIdentifierType toSectionIdentifier); - // [Export ("insertSectionsWithIdentifiers:afterSectionWithIdentifier:")] - // void InsertSectionsAfter (SectionIdentifierType [] sectionIdentifiers, SectionIdentifierType toSectionIdentifier); + [Export ("deleteSectionsWithIdentifiers:")] + void DeleteSections (SectionIdentifierType [] sectionIdentifiers); - // [Export ("deleteSectionsWithIdentifiers:")] - // void DeleteSections (SectionIdentifierType [] sectionIdentifiers); + [Export ("moveSectionWithIdentifier:beforeSectionWithIdentifier:")] + void MoveSectionBefore (SectionIdentifierType fromSectionIdentifier, SectionIdentifierType toSectionIdentifier); - // [Export ("moveSectionWithIdentifier:beforeSectionWithIdentifier:")] - // void MoveSectionBefore (SectionIdentifierType fromSectionIdentifier, SectionIdentifierType toSectionIdentifier); + [Export ("moveSectionWithIdentifier:afterSectionWithIdentifier:")] + void MoveSectionAfter (SectionIdentifierType fromSectionIdentifier, SectionIdentifierType toSectionIdentifier); - // [Export ("moveSectionWithIdentifier:afterSectionWithIdentifier:")] - // void MoveSectionAfter (SectionIdentifierType fromSectionIdentifier, SectionIdentifierType toSectionIdentifier); + [Export ("reloadSectionsWithIdentifiers:")] + void ReloadSections (SectionIdentifierType [] sectionIdentifiers); + } - // [Export ("reloadSectionsWithIdentifiers:")] - // void ReloadSections (SectionIdentifierType [] sectionIdentifiers); - // } + [NoWatch, TV (13,0), iOS (13,0)] + delegate UICollectionViewCell UICollectionViewDiffableDataSourceCellProvider (UICollectionView collectionView, NSIndexPath indexPath, NSObject obj); - // [NoWatch, TV (13,0), iOS (13,0)] - // delegate UICollectionViewCell UICollectionViewDiffableDataSourceCellProvider (UICollectionView collectionView, NSIndexPath indexPath, NSObject obj); + [NoWatch, TV (13,0), iOS (13,0)] + delegate UICollectionReusableView UICollectionViewDiffableDataSourceSupplementaryViewProvider (UICollectionView collectionView, string str, NSIndexPath indexPath); - // [NoWatch, TV (13,0), iOS (13,0)] - // delegate UICollectionReusableView UICollectionViewDiffableDataSourceSupplementaryViewProvider (UICollectionView collectionView, string str, NSIndexPath indexPath); + [NoWatch, TV (13,0), iOS (13,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface UICollectionViewDiffableDataSource : UICollectionViewDataSource + where SectionIdentifierType : NSObject + where ItemIdentifierType : NSObject { - // [NoWatch, TV (13,0), iOS (13,0)] - // [BaseType (typeof (NSObject))] - // [DisableDefaultCtor] - // interface UICollectionViewDiffableDataSource : UICollectionViewDataSource - // where SectionIdentifierType : NSObject - // where ItemIdentifierType : NSObject { + [Export ("initWithCollectionView:cellProvider:")] + IntPtr Constructor (UICollectionView collectionView, UICollectionViewDiffableDataSourceCellProvider cellProvider); - // [Export ("initWithCollectionView:cellProvider:")] - // IntPtr Constructor (UICollectionView collectionView, UICollectionViewDiffableDataSourceCellProvider cellProvider); + [NullAllowed, Export ("supplementaryViewProvider", ArgumentSemantic.Copy)] + UICollectionViewDiffableDataSourceSupplementaryViewProvider SupplementaryViewProvider { get; set; } - // [NullAllowed, Export ("supplementaryViewProvider", ArgumentSemantic.Copy)] - // UICollectionViewDiffableDataSourceSupplementaryViewProvider SupplementaryViewProvider { get; set; } + [Export ("snapshot")] + NSDiffableDataSourceSnapshot Snapshot { get; } - // [Export ("snapshot")] - // NSDiffableDataSourceSnapshot Snapshot { get; } + [Export ("applySnapshot:animatingDifferences:")] + void ApplySnapshot (NSDiffableDataSourceSnapshot snapshot, bool animatingDifferences); - // [Export ("applySnapshot:animatingDifferences:")] - // void ApplySnapshot (NSDiffableDataSourceSnapshot snapshot, bool animatingDifferences); + [Async] + [Export ("applySnapshot:animatingDifferences:completion:")] + void ApplySnapshot (NSDiffableDataSourceSnapshot snapshot, bool animatingDifferences, [NullAllowed] Action completion); - // [Async] - // [Export ("applySnapshot:animatingDifferences:completion:")] - // void ApplySnapshot (NSDiffableDataSourceSnapshot snapshot, bool animatingDifferences, [NullAllowed] Action completion); + [Export ("itemIdentifierForIndexPath:")] + [return: NullAllowed] + ItemIdentifierType GetItemIdentifier (NSIndexPath indexPath); - // [Export ("itemIdentifierForIndexPath:")] - // [return: NullAllowed] - // ItemIdentifierType GetItemIdentifier (NSIndexPath indexPath); + [Export ("indexPathForItemIdentifier:")] + [return: NullAllowed] + NSIndexPath GetIndexPath (ItemIdentifierType identifier); + } - // [Export ("indexPathForItemIdentifier:")] - // [return: NullAllowed] - // NSIndexPath GetIndexPath (ItemIdentifierType identifier); - // } + [NoWatch, TV (13,0), iOS (13,0)] + delegate UITableViewCell UITableViewDiffableDataSourceCellProvider (UITableView tableView, NSIndexPath indexPath, NSObject obj); - // [NoWatch, TV (13,0), iOS (13,0)] - // delegate UITableViewCell UITableViewDiffableDataSourceCellProvider (UITableView tableView, NSIndexPath indexPath, NSObject obj); + [NoWatch, TV (13,0), iOS (13,0)] + [BaseType (typeof (NSObject))] + [DisableDefaultCtor] + interface UITableViewDiffableDataSource : UITableViewDataSource + where SectionIdentifierType : NSObject + where ItemIdentifierType : NSObject { - // [NoWatch, TV (13,0), iOS (13,0)] - // [BaseType (typeof (NSObject))] - // [DisableDefaultCtor] - // interface UITableViewDiffableDataSource : UITableViewDataSource - // where SectionIdentifierType : NSObject - // where ItemIdentifierType : NSObject { + [Export ("initWithTableView:cellProvider:")] + IntPtr Constructor (UITableView tableView, UITableViewDiffableDataSourceCellProvider cellProvider); - // [Export ("initWithTableView:cellProvider:")] - // IntPtr Constructor (UITableView tableView, UITableViewDiffableDataSourceCellProvider cellProvider); + [Export ("snapshot")] + NSDiffableDataSourceSnapshot Snapshot { get; } - // [Export ("snapshot")] - // NSDiffableDataSourceSnapshot Snapshot { get; } + [Export ("applySnapshot:animatingDifferences:")] + void ApplySnapshot (NSDiffableDataSourceSnapshot snapshot, bool animatingDifferences); - // [Export ("applySnapshot:animatingDifferences:")] - // void ApplySnapshot (NSDiffableDataSourceSnapshot snapshot, bool animatingDifferences); + [Async] + [Export ("applySnapshot:animatingDifferences:completion:")] + void ApplySnapshot (NSDiffableDataSourceSnapshot snapshot, bool animatingDifferences, [NullAllowed] Action completion); - // [Async] - // [Export ("applySnapshot:animatingDifferences:completion:")] - // void ApplySnapshot (NSDiffableDataSourceSnapshot snapshot, bool animatingDifferences, [NullAllowed] Action completion); + [Export ("itemIdentifierForIndexPath:")] + [return: NullAllowed] + ItemIdentifierType GetItemIdentifier (NSIndexPath indexPath); - // [Export ("itemIdentifierForIndexPath:")] - // [return: NullAllowed] - // ItemIdentifierType GetItemIdentifier (NSIndexPath indexPath); + [Export ("indexPathForItemIdentifier:")] + [return: NullAllowed] + NSIndexPath GetIndexPath (ItemIdentifierType identifier); - // [Export ("indexPathForItemIdentifier:")] - // [return: NullAllowed] - // NSIndexPath GetIndexPath (ItemIdentifierType identifier); - - // [Export ("defaultRowAnimation", ArgumentSemantic.Assign)] - // UITableViewRowAnimation DefaultRowAnimation { get; set; } - // } + [Export ("defaultRowAnimation", ArgumentSemantic.Assign)] + UITableViewRowAnimation DefaultRowAnimation { get; set; } + } } diff --git a/tests/monotouch-test/UIKit/NSDiffableDataSourceSnapshotTest.cs b/tests/monotouch-test/UIKit/NSDiffableDataSourceSnapshotTest.cs new file mode 100644 index 0000000000..0e43c4030b --- /dev/null +++ b/tests/monotouch-test/UIKit/NSDiffableDataSourceSnapshotTest.cs @@ -0,0 +1,52 @@ +// +// Unit tests for NSDiffableDataSourceSnapshot +// +// Authors: +// Alex Soto +// +// +// Copyright 2019 Microsoft Corporation. +// + +#if !__WATCHOS__ && !MONOMAC +using System; +using NUnit.Framework; +using Foundation; +using UIKit; +using ObjCRuntime; + +namespace MonoTouchFixtures.UIKit { + [TestFixture] + [Preserve (AllMembers = true)] + public class NSDiffableDataSourceSnapshotTest { + + [SetUp] + public void Setup () + { + TestRuntime.AssertXcodeVersion (11, 0); + } + + // https://github.com/xamarin/xamarin-macios/issues/6567 + [Test] + public void GHIssue6567Test () + { + var type = typeof (UICollectionViewDiffableDataSource<,>); + Assert.NotNull (type, $"{nameof (type)} was null;"); + + Class cls = null; + Assert.DoesNotThrow (() => cls = new Class (type), "Should not throw"); + Assert.NotNull (cls, $"{nameof (cls)} was null"); + } + + [Test] + public void ObjectUsageTest () + { + var diff = new NSDiffableDataSourceSnapshot (); + diff.AppendSections (new NSNumber [] { NSNumber.FromNInt (1) }); + diff.AppendItems (new NSUuid [] { new NSUuid () }, NSNumber.FromNInt (1)); + Assert.That (diff.NumberOfSections, Is.GreaterThan (0), "Sections"); + Assert.That (diff.GetNumberOfItems (NSNumber.FromNInt (1)), Is.GreaterThan (0), "Items"); + } + } +} +#endif // !__WATCHOS__ && !MONOMAC diff --git a/tests/xtro-sharpie/iOS-UIKit.todo b/tests/xtro-sharpie/iOS-UIKit.todo index e685295296..e69de29bb2 100644 --- a/tests/xtro-sharpie/iOS-UIKit.todo +++ b/tests/xtro-sharpie/iOS-UIKit.todo @@ -1,44 +0,0 @@ -!missing-selector! NSDiffableDataSourceSnapshot::appendItemsWithIdentifiers: not bound -!missing-selector! NSDiffableDataSourceSnapshot::appendItemsWithIdentifiers:intoSectionWithIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::appendSectionsWithIdentifiers: not bound -!missing-selector! NSDiffableDataSourceSnapshot::deleteAllItems not bound -!missing-selector! NSDiffableDataSourceSnapshot::deleteItemsWithIdentifiers: not bound -!missing-selector! NSDiffableDataSourceSnapshot::deleteSectionsWithIdentifiers: not bound -!missing-selector! NSDiffableDataSourceSnapshot::indexOfItemIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::indexOfSectionIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::insertItemsWithIdentifiers:afterItemWithIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::insertItemsWithIdentifiers:beforeItemWithIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::insertSectionsWithIdentifiers:afterSectionWithIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::insertSectionsWithIdentifiers:beforeSectionWithIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::itemIdentifiers not bound -!missing-selector! NSDiffableDataSourceSnapshot::itemIdentifiersInSectionWithIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::moveItemWithIdentifier:afterItemWithIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::moveItemWithIdentifier:beforeItemWithIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::moveSectionWithIdentifier:afterSectionWithIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::moveSectionWithIdentifier:beforeSectionWithIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::numberOfItems not bound -!missing-selector! NSDiffableDataSourceSnapshot::numberOfItemsInSection: not bound -!missing-selector! NSDiffableDataSourceSnapshot::numberOfSections not bound -!missing-selector! NSDiffableDataSourceSnapshot::reloadItemsWithIdentifiers: not bound -!missing-selector! NSDiffableDataSourceSnapshot::reloadSectionsWithIdentifiers: not bound -!missing-selector! NSDiffableDataSourceSnapshot::sectionIdentifierForSectionContainingItemIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::sectionIdentifiers not bound -!missing-selector! UICollectionViewDiffableDataSource::applySnapshot:animatingDifferences: not bound -!missing-selector! UICollectionViewDiffableDataSource::applySnapshot:animatingDifferences:completion: not bound -!missing-selector! UICollectionViewDiffableDataSource::indexPathForItemIdentifier: not bound -!missing-selector! UICollectionViewDiffableDataSource::initWithCollectionView:cellProvider: not bound -!missing-selector! UICollectionViewDiffableDataSource::itemIdentifierForIndexPath: not bound -!missing-selector! UICollectionViewDiffableDataSource::setSupplementaryViewProvider: not bound -!missing-selector! UICollectionViewDiffableDataSource::snapshot not bound -!missing-selector! UICollectionViewDiffableDataSource::supplementaryViewProvider not bound -!missing-selector! UITableViewDiffableDataSource::applySnapshot:animatingDifferences: not bound -!missing-selector! UITableViewDiffableDataSource::applySnapshot:animatingDifferences:completion: not bound -!missing-selector! UITableViewDiffableDataSource::defaultRowAnimation not bound -!missing-selector! UITableViewDiffableDataSource::indexPathForItemIdentifier: not bound -!missing-selector! UITableViewDiffableDataSource::initWithTableView:cellProvider: not bound -!missing-selector! UITableViewDiffableDataSource::itemIdentifierForIndexPath: not bound -!missing-selector! UITableViewDiffableDataSource::setDefaultRowAnimation: not bound -!missing-selector! UITableViewDiffableDataSource::snapshot not bound -!missing-type! NSDiffableDataSourceSnapshot not bound -!missing-type! UICollectionViewDiffableDataSource not bound -!missing-type! UITableViewDiffableDataSource not bound diff --git a/tests/xtro-sharpie/tvOS-UIKit.todo b/tests/xtro-sharpie/tvOS-UIKit.todo index e685295296..e69de29bb2 100644 --- a/tests/xtro-sharpie/tvOS-UIKit.todo +++ b/tests/xtro-sharpie/tvOS-UIKit.todo @@ -1,44 +0,0 @@ -!missing-selector! NSDiffableDataSourceSnapshot::appendItemsWithIdentifiers: not bound -!missing-selector! NSDiffableDataSourceSnapshot::appendItemsWithIdentifiers:intoSectionWithIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::appendSectionsWithIdentifiers: not bound -!missing-selector! NSDiffableDataSourceSnapshot::deleteAllItems not bound -!missing-selector! NSDiffableDataSourceSnapshot::deleteItemsWithIdentifiers: not bound -!missing-selector! NSDiffableDataSourceSnapshot::deleteSectionsWithIdentifiers: not bound -!missing-selector! NSDiffableDataSourceSnapshot::indexOfItemIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::indexOfSectionIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::insertItemsWithIdentifiers:afterItemWithIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::insertItemsWithIdentifiers:beforeItemWithIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::insertSectionsWithIdentifiers:afterSectionWithIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::insertSectionsWithIdentifiers:beforeSectionWithIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::itemIdentifiers not bound -!missing-selector! NSDiffableDataSourceSnapshot::itemIdentifiersInSectionWithIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::moveItemWithIdentifier:afterItemWithIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::moveItemWithIdentifier:beforeItemWithIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::moveSectionWithIdentifier:afterSectionWithIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::moveSectionWithIdentifier:beforeSectionWithIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::numberOfItems not bound -!missing-selector! NSDiffableDataSourceSnapshot::numberOfItemsInSection: not bound -!missing-selector! NSDiffableDataSourceSnapshot::numberOfSections not bound -!missing-selector! NSDiffableDataSourceSnapshot::reloadItemsWithIdentifiers: not bound -!missing-selector! NSDiffableDataSourceSnapshot::reloadSectionsWithIdentifiers: not bound -!missing-selector! NSDiffableDataSourceSnapshot::sectionIdentifierForSectionContainingItemIdentifier: not bound -!missing-selector! NSDiffableDataSourceSnapshot::sectionIdentifiers not bound -!missing-selector! UICollectionViewDiffableDataSource::applySnapshot:animatingDifferences: not bound -!missing-selector! UICollectionViewDiffableDataSource::applySnapshot:animatingDifferences:completion: not bound -!missing-selector! UICollectionViewDiffableDataSource::indexPathForItemIdentifier: not bound -!missing-selector! UICollectionViewDiffableDataSource::initWithCollectionView:cellProvider: not bound -!missing-selector! UICollectionViewDiffableDataSource::itemIdentifierForIndexPath: not bound -!missing-selector! UICollectionViewDiffableDataSource::setSupplementaryViewProvider: not bound -!missing-selector! UICollectionViewDiffableDataSource::snapshot not bound -!missing-selector! UICollectionViewDiffableDataSource::supplementaryViewProvider not bound -!missing-selector! UITableViewDiffableDataSource::applySnapshot:animatingDifferences: not bound -!missing-selector! UITableViewDiffableDataSource::applySnapshot:animatingDifferences:completion: not bound -!missing-selector! UITableViewDiffableDataSource::defaultRowAnimation not bound -!missing-selector! UITableViewDiffableDataSource::indexPathForItemIdentifier: not bound -!missing-selector! UITableViewDiffableDataSource::initWithTableView:cellProvider: not bound -!missing-selector! UITableViewDiffableDataSource::itemIdentifierForIndexPath: not bound -!missing-selector! UITableViewDiffableDataSource::setDefaultRowAnimation: not bound -!missing-selector! UITableViewDiffableDataSource::snapshot not bound -!missing-type! NSDiffableDataSourceSnapshot not bound -!missing-type! UICollectionViewDiffableDataSource not bound -!missing-type! UITableViewDiffableDataSource not bound