![](/img/trans.png)
[英]What's the difference between these two UIActivityType for Facebook sharing?
[英]What's the difference between these two lines?
我正在使用名为MNCalendar的GitHub repo,我想调用一些单元格。 现在,我就是这样做的。
MNCalendarViewDayCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath];
MNCalendarViewDayCell *cell = (MNCalendarViewDayCell*)[self.collectionView cellForItemAtIndexPath:indexPath];
第一行给了我一个问题,它是一个指向UICollectionViewCell的MNCalendarViewDayCell指针,但另一个很好。 引擎盖下发生了什么,为什么底部正确?
不是关键的错误,只是一个问题,只是想知道并试图从中学到一些东西:)
cellForItemAtIndexPath
返回指向UICollectionViewCell
对象的指针,但您将结果分配给MNCalendarViewDayCell
。
警告是编译器告诉你“嘿 - 你声明的这个变量是一个MNCalendarViewDayCell
,但看起来你正在为它分配一个不同类型的对象”。
在这种情况下,这是故意的 - 您已经创建了一个UICollectionViewCell
的自定义子类。 这种不匹配的类型不会导致任何问题。 因此,为了防止警告我们执行所谓的转换 :我们告诉编译器,即使该方法说它将返回一个指向一个类的指针,我们希望它是另一个类:
MNCalendarViewDayCell *cell = (MNCalendarViewDayCell*)[self.collectionView cellForItemAtIndexPath:indexPath];
[self.collectionView cellForItemAtIndexPath:indexPath]
返回UICollectionViewCell
。 并非所有UICollectionViewCell
对象都是MNCalendarViewDayCell
,这就是您收到警告的原因。 通过显式转换(MNCalendarViewDayCell *)
您告诉编译器它是MNCalendarViewDayCell
。
cellForItemAtIndexPath:
返回一个UICollectionViewCell
实例。 但是您将它分配给MKCalendarViewCell变量。
如果MKCalendarViewCell是UICollectionViewCell的子类,那么Liskov Substitution Principle下没有真正的问题。 而Objective-C是一种动态语言,所以这是支持的。
您看到的错误来自编译器,告诉您正在将一种类型的对象分配给另一种类型的变量。 通过强制转换你会说尽管返回类型是一个类,但你知道的更好,它实际上是另一个类的实例。 这现在成为您的问题,以验证实际情况。
所以,第一个抓住一个指向UICollectionViewCell
,这是基类的MNCalendarViewDayCell
是。 然而,虽然它是一个超级类,你不能只将它分配给一个子类,所以(MNCalendarViewDayCell *)
所做的就是说你要将指针从它的基类UICollectionViewCell
转换为子类。 这就是为什么第二个工作正常,因为你将它转换为分配所需的正确类型。
cellForItemAtIndexPath
返回UICollectionViewCell ,而不是您的自定义MNCalendarViewDayCell 。 因此,当您将结果分配给MNCalendarViewDayCell *cell
,它会引发错误(根据OOP,父母不知道它的孩子,但是孩子知道他的父母)。 因此,您只需将其类型化为您的子单元格。
在这两个语句中,您都将UICollectionViewCell
向下转换为MNCalendarViewDayCell
。 由于MNCalendarViewDayCell
是MNCalendarViewDayCell
的子类, UICollectionViewCell
它可能实现UICollectionViewCell
中未实现的UICollectionViewCell
,这就是您收到警告的原因。 使用(MNCalendarViewDayCell *)
强制转换并删除警告。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.