我有这个美丽的&我在项目中拥有的方便的帮助内联函数(原来它的根源是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的相同(最新)版本,因此不确定可能会阻止一方而不是另一方的差异......项目设置在任一项目中都明显不同(如提到,一个是框架,一个是常规项目)但是会这样做吗?
提前感谢!
按住命令并单击方法或属性以获取编译器看到的所有实例的下拉列表...您可能会有相互冲突的返回类型。
答案 0 :(得分:3)
听起来问题是框架/库中的某些类声明了-count
方法,该方法返回的内容与-[NSArray count]
不同(等等)。
即使您向未知(id
)类型的对象发送消息,编译器也需要知道有关将要调用的方法的一些信息,包括返回类型。简而言之,这是因为消息发送路径根据将被调用的方法的返回类型而不同。在类似代码的情况下,编译器将查找项目中声明的任何方法,其名称与您发送的消息相匹配,并假设为了计算返回类型等而调用的方法。例如,它发现了两个具有相同名称的不同方法,但它们具有不同的返回类型,因此不知道发送count
消息所需的确切语义。
快速而肮脏的解决方案是将isEmpty()
功能中的演员阵容更改为[(NSArray *)thing count]
。只要您从不使用具有不同isEmpty()
方法的任何类的实例调用-count
,这应该可以正常工作。
答案 1 :(得分:1)
更新:将方法的意义改为不为空,以处理nil
值。
不是一个答案,但你可以用类别来做到这一点:
@interface NSObject (IsEmpty)
-(BOOL)isNotEmpty ;
@end
@implementation NSObject (IsEmpty)
-(BOOL)isNotEmpty { return NO ; /* I guess? */ }
@end
@implementation NSArray (IsEmpty)
-(BOOL)isNotEmpty { return self.count > 0 ; }
@end
@implementation NSDictionary (IsEmpty)
-(BOOL)isNotEmpty { return self.count > 0 ; }
@end
@implementation NSSet (IsEmpty)
-(BOOL)isNotEmpty { return self.count > 0 ; }
@end
@implementation NSNull (IsEmpty)
-(BOOL)isNotEmpty { return NO ; }
@end
现在你可以这样做:
id objectOrNil = ... ;
BOOL isEmpty = ![ objectOrNil isNotEmpty ] ;
答案 2 :(得分:0)
我想正确的方法是将[thing count]
的结果显式地转换为整数:
static inline BOOL isEmpty(id thing) {
return !thing
|| [thing isKindOfClass:[NSNull class]]
|| ([thing respondsToSelector:@selector(length)] && [((id)thing) length] == 0)
|| ([thing respondsToSelector:@selector(count)] && (NSUInteger)[((id)thing) count] == 0);
}
这将告诉编译器,由于此方法调用,您希望看到无符号整数。
答案 3 :(得分:0)
static inline BOOL isEmpty(id thing) {
return !thing
|| [thing isKindOfClass:[NSNull class]]
|| ([thing respondsToSelector:@selector(length)]
&& [(NSData *) thing length] == 0)
|| ([thing respondsToSelector:@selector(count)]
&& [(NSArray *) thing count] == 0);
}
不应该与[NSArray count]方法混淆。希望这会有所帮助。