Objective-C 编译器进行的奇怪的明显类型推断

Strange apparent type inference by Objective-C compiler

考虑一个包含以下行的 Objective-C 程序:

NSArray *records = dictionary[string];
NSDate  *date    = [records.lastObject date];

其中 recordsNSManagedObject 的数组,具有 NSDate.

类型的属性 date

编译器(在 Xcode 6.1.1 中)对第二行发出以下警告:

Incompatible pointer types initializing NSDate * with an expression 
of type GTLDateTime.

怎么会这样?我不希望编译器尝试任何 records.lastObject 类型 id 之后的推论。但它似乎试图得出一个错误的结论。

那么这里可能发生了什么?

问题是您的项目某处有一个名为 date 的方法,该方法 return 是一个 GTLDateTime 对象。由于 .lastObjectid 类型,xcode 搜索名为 "date" 的选择器以尝试推断 return 类型。如果您的代码是正确的,您应该将 [records.lastObject date] 转换为 NSDate 或任何正确的 return 类型,那么您应该没问题。