ios - Objective-C isEmpty helper 突然停止构建

标签 ios objective-c xcode

我在一个项目中得到了这个漂亮且方便的辅助内联函数(最初它源于 herehere ):

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 等很有用...我现在的问题是我将它引入了另一个项目(我将使用的静态框架/库)并拥有以下问题正在阻止我的项目构建:

Multiple methods named 'count' found with mismatched result, parameter type or attributes

我在两者上都使用相同(最新)版本的 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/

相关文章:

iOS 11 测试版 : Mail View Controller called from app will not send mail

ios - UIImageView 中的矢量图像在 iOS 12 和 13 中呈现不同的方式

ios - React Native ios 选择器始终打开

ios - Dealloc 释放后不会立即调用

IOS Facebook SDK 3 上传带消息的图片

ios - 设置 NSObject 属性 - EXC_BAD_ACCESS

iOS:我有一个要求 textview 成为第一响应者

ios - 试图获得一个按钮来打开 ios 上的日历。单击按钮时没有任何反应

ios - 突出显示时 UIButton 周围不需要的不可见检测区域

ios - 插入 CollectionView 会引发无效更新错误