我在一个项目中得到了这个漂亮且方便的辅助内联函数(最初它源于 here 和 here ):
static inline BOOL isEmpty(id thing) {
return !thing
|| [thing isKindOfClass:[NSNull class]]
|| ([thing respondsToSelector:@selector(length)] && [((id)thing) length] == 0)
|| ([thing respondsToSelector:@selector(count)] && [((id)thing) count] == 0);
}
static inline BOOL isNotEmpty(id thing) {
return !isEmpty(thing);
}
一切正常。
它对于检查 NSString、NSData、NSArray、NSDictionary、NSSet 等很有用...我现在的问题是我将它引入了另一个项目(我将使用的静态框架/库)并拥有以下问题正在阻止我的项目构建:
我在两者上都使用相同(最新)版本的 xCode,所以不确定有什么区别会在一侧而不是另一侧停止...项目设置在两个项目中明显不同(如提到过,一个是框架,一个是常规项目)但是这样做可以吗?
提前致谢!
解决方案后编辑以供将来访问:
按住命令并单击方法或属性以获取编译器正在查看的所有实例的下拉列表...您可能有冲突的返回类型。
最佳答案
听起来问题在于框架/库中的某些类声明了一个 -count
方法,该方法返回不同于 -[NSArray count]
的内容( ETC。)。
即使您向未知 (id
) 类型的对象发送消息,编译器也需要知道有关将调用的方法的一些信息,包括返回类型。简而言之,这是因为消息发送路径因将要调用的方法的返回类型而异。在像您的代码这样的情况下,编译器将查找项目中声明的任何方法,其名称与您发送的消息相匹配,并假设该方法是为了确定返回类型等而调用的方法。在此在这种情况下,它找到了两个具有相同名称但返回类型不同的不同方法,因此不知道发送 count
消息所需的确切语义。
快速而肮脏的解决方案是将 isEmpty()
函数中的转换更改为 [(NSArray *)thing count]
。只要您从不使用具有不同 -count
方法的任何类的实例调用 isEmpty()
,这应该可以正常工作。
关于ios - Objective-C isEmpty helper 突然停止构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20690884/