这两条线之间有什么区别?

时间:2013-09-23 10:53:41

标签: ios objective-c

我正在使用名为MNCalendar的GitHub repo,我想调用一些单元格。现在,我就是这样做的。

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

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

不是关键的错误,只是一个问题,只是想知道并试图从中学到一些东西:)

6 个答案:

答案 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)

在这两个陈述中,您都是downcastingUICollectionViewCellMNCalendarViewDayCell。 由于MNCalendarViewDayCellUICollectionViewCell的子类,因此它可能会实现UICollectionViewCell中未实现的方法,这就是您收到警告的原因。使用(MNCalendarViewDayCell *)强制转换并删除警告。