2013-09-23 186 views
3

我正在使用一个名为MNCalendar的GitHub仓库,我想调用一些单元格。现在,我是这么做的。这两行之间有什么区别?

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

第一行给了我一个问题,它是一个MNCalendarViewDayCell指针UICollectionViewCell,而另一次是罚款。这里引发了什么,为什么最下面的一个是正确的?

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

回答

2

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

警告是编译器告诉你“嘿 - 这个变量你声明是MNCalendarViewDayCell,但它看起来就像你分配一个不同类型的对象,以它

在这种情况下,。这是故意的 - 你已经创建了一个UICollectionViewCell的自定义子类,这种不匹配的类型不会引起任何问题,所以为了防止这个警告我们做所谓的铸造:即使方法告诉编译器说它会返回一个指向我们期望它是另一个类的指针:

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

所以第一个抓住一个指向UICollectionViewCell,这是基类的MNCalendarViewDayCell是什么。不过,虽然它是一个超级类,但不能将其分配给子类,所以(MNCalendarViewDayCell *)所做的就是说您要将指针从其基类UICollectionViewCell转换为子类。这就是为什么第二个工作原理,因为您正在将其转换为分配所需的正确类型。

1

[self.collectionView cellForItemAtIndexPath:indexPath]返回UICollectionViewCell。并非所有的UICollectionViewCell对象都是MNCalendarViewDayCell,这就是为什么你会收到警告。通过明确的转换(MNCalendarViewDayCell *)告诉编译器它是MNCalendarViewDayCell

0

cellForItemAtIndexPath回报你UICollectionViewCell,没有你的自定义MNCalendarViewDayCell。所以当你把结果分配给MNCalendarViewDayCell *cell时,它会引起错误(根据OOP,父母不知道它是孩子,但孩子知道他的父母)。所以你只需简单地将它分类到你的孩子细胞中即可。

0

在这两份声明中您都是downcasting a UICollectionViewCellMNCalendarViewDayCell。 由于MNCalendarViewDayCellUICollectionViewCell的子类,因此它可能会实现在UICollectionViewCell中未实现的方法,这就是为什么您会收到警告。使用(MNCalendarViewDayCell *)强制施放并放弃警告。

1

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

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

您看到的错误来自编译器,告诉您将一种类型的对象分配给另一种类型的变量。通过演绎它,你可以说虽然返回类型是一类的,但你知道的更好,它实际上是另一类的实例。这现在成为你的问题,以验证这是实际情况。

相关问题