我正在使用名为MNCalendar的GitHub repo,我想调用一些单元格。现在,我就是这样做的。
MNCalendarViewDayCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath];
MNCalendarViewDayCell *cell = (MNCalendarViewDayCell*)[self.collectionView cellForItemAtIndexPath:indexPath];
第一行给了我一个关于它是一个指向UICollectionViewCell的MNCalendarViewDayCell指针的问题,但另一个很好。引擎盖下发生了什么,为什么底部正确?
不是关键的错误,只是一个问题,只是想知道并试图从中学到一些东西:)
答案 0 :(得分:2)
cellForItemAtIndexPath
返回指向UICollectionViewCell
对象的指针,但您将结果分配给MNCalendarViewDayCell
。
警告是编译器告诉你“嘿 - 你声明的这个变量是MNCalendarViewDayCell
,但看起来你正在为它分配一个不同类型的对象”。
在这种情况下,这是故意的 - 您已经创建了UICollectionViewCell
的自定义子类。这种不匹配的类型不会导致任何问题。因此,为了防止警告,我们执行所谓的强制转换:我们告诉编译器即使方法说它也会返回指向一个类的指针,我们希望它是另一个类:< / p>
MNCalendarViewDayCell *cell = (MNCalendarViewDayCell*)[self.collectionView cellForItemAtIndexPath:indexPath];
答案 1 :(得分:1)
[self.collectionView cellForItemAtIndexPath:indexPath]
返回UICollectionViewCell
。并非所有UICollectionViewCell
个对象都是MNCalendarViewDayCell
,这就是您收到警告的原因。通过显式转换(MNCalendarViewDayCell *)
,您告诉编译器它是MNCalendarViewDayCell
。
答案 2 :(得分:1)
cellForItemAtIndexPath:
会返回UICollectionViewCell
个实例。但是您将它分配给MKCalendarViewCell变量。
如果MKCalendarViewCell是UICollectionViewCell的子类,那么Liskov Substitution Principle下没有真正的问题。而Objective-C是一种动态语言,所以支持它。
您看到的错误来自编译器,告诉您正在将一种类型的对象分配给另一种类型的变量。通过强制转换你会说尽管返回类型是一个类,但你知道的更好,它实际上是另一个类的实例。这现在成为您的问题,以验证实际情况确实如此。
答案 3 :(得分:0)
所以第一个抓取指向UICollectionViewCell
的指针,这是MNCalendarViewDayCell
的基类。然而,虽然它是一个超类,你不能只将它分配给一个子类,所以(MNCalendarViewDayCell *)
所做的就是说你要将指针从它的基类UICollectionViewCell
转换为子类代替。这就是为什么第二个工作正常,因为你将它转换为分配所需的正确类型。
答案 4 :(得分:0)
cellForItemAtIndexPath
会返回 UICollectionViewCell ,而非您的自定义 MNCalendarViewDayCell 。因此,当您将结果分配给MNCalendarViewDayCell *cell
时,会引发错误(根据OOP,父母不知道它的孩子,但是孩子知道他的父母)。因此,您只需将其类型化为您的子单元格。
答案 5 :(得分:0)
在这两个陈述中,您都是downcasting和UICollectionViewCell
到MNCalendarViewDayCell
。
由于MNCalendarViewDayCell
是UICollectionViewCell
的子类,因此它可能会实现UICollectionViewCell
中未实现的方法,这就是您收到警告的原因。使用(MNCalendarViewDayCell *)
强制转换并删除警告。