[registrar] Fix a generics type issue with dynamic registrar (#6646)

* [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 ツ
This commit is contained in:
Alex Soto 2019-07-25 05:56:39 -04:00 коммит произвёл GitHub
Родитель 67087c2282
Коммит d095f75471
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
5 изменённых файлов: 177 добавлений и 203 удалений

Просмотреть файл

@ -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;

Просмотреть файл

@ -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<SectionIdentifierType, ItemIdentifierType> : NSCopying
where SectionIdentifierType : NSObject
where ItemIdentifierType : NSObject {
// [Watch (6,0), TV (13,0), iOS (13,0)]
// [BaseType (typeof (NSObject))]
// interface NSDiffableDataSourceSnapshot<SectionIdentifierType, ItemIdentifierType> : 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<SectionIdentifierType, ItemIdentifierType> : UICollectionViewDataSource
where SectionIdentifierType : NSObject
where ItemIdentifierType : NSObject {
// [NoWatch, TV (13,0), iOS (13,0)]
// [BaseType (typeof (NSObject))]
// [DisableDefaultCtor]
// interface UICollectionViewDiffableDataSource<SectionIdentifierType, ItemIdentifierType> : 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<SectionIdentifierType, ItemIdentifierType> Snapshot { get; }
// [Export ("snapshot")]
// NSDiffableDataSourceSnapshot<SectionIdentifierType, ItemIdentifierType> Snapshot { get; }
[Export ("applySnapshot:animatingDifferences:")]
void ApplySnapshot (NSDiffableDataSourceSnapshot<SectionIdentifierType, ItemIdentifierType> snapshot, bool animatingDifferences);
// [Export ("applySnapshot:animatingDifferences:")]
// void ApplySnapshot (NSDiffableDataSourceSnapshot<SectionIdentifierType, ItemIdentifierType> snapshot, bool animatingDifferences);
[Async]
[Export ("applySnapshot:animatingDifferences:completion:")]
void ApplySnapshot (NSDiffableDataSourceSnapshot<SectionIdentifierType, ItemIdentifierType> snapshot, bool animatingDifferences, [NullAllowed] Action completion);
// [Async]
// [Export ("applySnapshot:animatingDifferences:completion:")]
// void ApplySnapshot (NSDiffableDataSourceSnapshot<SectionIdentifierType, ItemIdentifierType> 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<SectionIdentifierType,ItemIdentifierType> : UITableViewDataSource
where SectionIdentifierType : NSObject
where ItemIdentifierType : NSObject {
// [NoWatch, TV (13,0), iOS (13,0)]
// [BaseType (typeof (NSObject))]
// [DisableDefaultCtor]
// interface UITableViewDiffableDataSource<SectionIdentifierType,ItemIdentifierType> : 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<SectionIdentifierType, ItemIdentifierType> Snapshot { get; }
// [Export ("snapshot")]
// NSDiffableDataSourceSnapshot<SectionIdentifierType, ItemIdentifierType> Snapshot { get; }
[Export ("applySnapshot:animatingDifferences:")]
void ApplySnapshot (NSDiffableDataSourceSnapshot<SectionIdentifierType, ItemIdentifierType> snapshot, bool animatingDifferences);
// [Export ("applySnapshot:animatingDifferences:")]
// void ApplySnapshot (NSDiffableDataSourceSnapshot<SectionIdentifierType, ItemIdentifierType> snapshot, bool animatingDifferences);
[Async]
[Export ("applySnapshot:animatingDifferences:completion:")]
void ApplySnapshot (NSDiffableDataSourceSnapshot<SectionIdentifierType, ItemIdentifierType> snapshot, bool animatingDifferences, [NullAllowed] Action completion);
// [Async]
// [Export ("applySnapshot:animatingDifferences:completion:")]
// void ApplySnapshot (NSDiffableDataSourceSnapshot<SectionIdentifierType, ItemIdentifierType> 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; }
}
}

Просмотреть файл

@ -0,0 +1,52 @@
//
// Unit tests for NSDiffableDataSourceSnapshot
//
// Authors:
// Alex Soto <alexsoto@microsoft.com>
//
//
// 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<NSNumber, NSUuid> ();
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

Просмотреть файл

@ -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

Просмотреть файл

@ -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