3

我正在使用一个名为 MNCalendar 的 GitHub 存储库,我想调用一些单元格。现在,这就是我的做法。

MNCalendarViewDayCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath];
MNCalendarViewDayCell *cell = (MNCalendarViewDayCell*)[self.collectionView cellForItemAtIndexPath:indexPath];

第一行给了我一个关于它是指向 UICollectionViewCell 的 MNCalendarViewDayCell 指针的问题,但另一行很好。这里的引擎盖下发生了什么,为什么底部是正确的?

不是严重的错误,只是一个问题,只是想知道并尝试从中学习一些东西:)

4

6 回答 6

2

cellForItemAtIndexPath返回指向UICollectionViewCell对象的指针,但您将结果分配给MNCalendarViewDayCell.

警告是编译器告诉你“嘿 - 你声明的这个变量是 a MNCalendarViewDayCell,但看起来你正在为它分配一个不同类型的对象”。

在这种情况下,这是故意的 - 您已经创建了UICollectionViewCell. 这种不匹配的类型不会导致任何问题。因此,为了防止出现警告,我们执行了所谓的强制转换:我们告诉编译器,即使该方法它将返回一个指向我们期望它是另一个类的指针:

MNCalendarViewDayCell *cell = (MNCalendarViewDayCell*)[self.collectionView cellForItemAtIndexPath:indexPath];
于 2013-09-23T11:01:31.740 回答
1

[self.collectionView cellForItemAtIndexPath:indexPath]返回UICollectionViewCell。并非所有UICollectionViewCell对象都是MNCalendarViewDayCell,这就是您收到警告的原因。通过显式转换,(MNCalendarViewDayCell *)您告诉编译器它是MNCalendarViewDayCell.

于 2013-09-23T11:00:30.067 回答
1

cellForItemAtIndexPath:返回一个UICollectionViewCell实例。但是您将其分配给 MKCalendarViewCell 变量。

如果 MKCalendarViewCell 是 UICollectionViewCell 的子类,那么在 Liskov 替换原则下就没有问题了。而Objective-C 是一种动态语言,因此支持这一点。

您看到的错误来自编译器,告诉您正在将一种类型的对象分配给另一种类型的变量。通过强制转换,您是在说虽然返回类型属于一个类,但您更清楚它实际上是另一个类的实例。这现在成为您验证是否确实如此的问题。

于 2013-09-23T11:03:07.127 回答
0

所以第一个获取指向 a 的指针UICollectionViewCell,这就是 of 的基类MNCalendarViewDayCell。然而,虽然它是一个超类,但您不能只将它分配给一个子类,所以它的(MNCalendarViewDayCell *)作用是说您要将指针从它的基类UICollectionViewCell转换为子类。这就是第二个有效的原因,因为您正在将其转换为分配所需的正确类型。

于 2013-09-23T10:59:13.183 回答
0

cellForItemAtIndexPath返回您UICollectionViewCell,而不是您的自定义MNCalendarViewDayCell。因此,当您将结果分配给 时MNCalendarViewDayCell *cell,它会引发错误(根据 OOP,父母不知道它的孩子,但孩子知道他的父母)。因此,您只需将其类型转换到您的子单元格中。

于 2013-09-23T11:01:22.797 回答
0

在这两种陈述中,您都将a向下转换UICollectionViewCellMNCalendarViewDayCell。由于MNCalendarViewDayCell它的子类UICollectionViewCell可能实现未实现的方法UICollectionViewCell,这就是您收到警告的原因。Using(MNCalendarViewDayCell *)强制施法并放弃警告。

于 2013-09-23T11:01:34.010 回答