只需取消注释即可return nil
,一切都会好起来的。因为你的最后else
处理所有情况,代码永远达不到那个return nil
,但 Xcode 的分析器显然不够聪明,无法知道这一点。
编辑:此设置可以在“Apple LLVM 5.0 - 警告 - 所有语言”下的“构建设置”中找到。它属于“不匹配的返回类型”,过去默认为“是”,现在默认为“是”(视为错误)。您可以更改此设置以将其改回警告。但我不会那样做。只需取消注释您的return nil
没关系。
我想指出的是,到达非 void 函数的末尾而不返回值是一个错误,并且很可能导致崩溃,而返回 nil (例如)可能不会。考虑以下简单示例:
- (NSString*) someString
{
return nil;
}
// ... someplace elsewhere in the code:
NSString* aString = [self someString];
NSLog( @"aString = %@", aString );
这很好,你的输出将类似于:
返回了一个东西(空)
现在,如果您注释掉该返回,则:
- (NSString*) someString
{
// return nil;
}
// ... someplace elsewhere in the code:
NSString* aString = [self someString];
NSLog( @"aString = %@", aString );
NSLog 调用将取消引用某些随机内存位置(我认为无论堆栈上发生了什么),您的应用程序几乎肯定会崩溃。
如果您有一个返回某种类型值的函数,那么它必须始终返回该类型的值。
Edit2(回应@Dave DeLong的评论):
好点,回来了nil
from collectionView:cellForItemAtIndexPath:
is一个错误,但我可能会认为,与简单地让函数在没有返回值的情况下结束相比,这是一个不太严重的错误。事实证明有点学术性,因为OP的代码是最终的return nil
无论如何,永远不会执行。
人们可以重写该函数,以避免出现警告并键入“return nil”,因此:
- (UICollectionViewCell *) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
id cell = nil;
if (collectionView.tag == 0) {
// Make a Subject cell
}
else if (collectionView.tag == 1) {
// Make a Category cell.
}
else {
// Make a Card cell.
}
return cell;
}
...但最终结果与OP的原始代码相同(带有return nil
未注释):该函数可以但不会返回 nil。