如何比较 Objective-C 中声明为 id<protocol> 的实例
How to compare instances declared as id<protocol> in Objective-C
我有一个 class,它有一个声明为类型 id 的属性,该类型 id 遵守协议,我想确保它的平等性。
如何检查声明为 id
类型的属性的值是否相等?
@interface MyClass : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) id<SomeProtocol> attribute;
@end
@implementation MyClass
- (BOOL)isEqual:(id)object {
if (self == object) {
return YES;
}
if (![object isKindOfClass:[MyClass class]]) {
return NO;
}
return [self isEqualToMyClass:(MyClass *) object];
}
- (BOOL)isEqualToMyClass:(MyClass *)rhsValue {
if (rhsValue == nil) {
return NO;
}
return
([self.name isEqualToString:rhsValue.name] &&
// Compiler produces error: Error:(90, 36) no known instance method for selector 'isEqual:'
[self.attribute isEqual:rhs.attribute]);
}
@end
SomeProtocol 定义为:
@protocol SomeProtocol <NSObject>
@end
类扩展 SomeProtocol
:
@interface MyAttributeClass : NSObject <SomeProtocol>
@end
MyAttributeClass 实现协议 SomeProtocol
并且它有自己的 isEqual 并且当它的一个实例被 MyClass
存储在属性中时,我希望能够检查这些值是否是相当于.
分配给 MyClass 的是 MyAttributeClass:
MyClass *myClass = [[MyClass alloc] init];
myClass.name = "HAL";
myClass.attribute = [[MyAttributeClass alloc] init];
可能您忘记导入包含协议定义的 header。 (而不是只有前向声明。)在实现之前添加它。
我有一个 class,它有一个声明为类型 id 的属性,该类型 id 遵守协议,我想确保它的平等性。
如何检查声明为 id
类型的属性的值是否相等?
@interface MyClass : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) id<SomeProtocol> attribute;
@end
@implementation MyClass
- (BOOL)isEqual:(id)object {
if (self == object) {
return YES;
}
if (![object isKindOfClass:[MyClass class]]) {
return NO;
}
return [self isEqualToMyClass:(MyClass *) object];
}
- (BOOL)isEqualToMyClass:(MyClass *)rhsValue {
if (rhsValue == nil) {
return NO;
}
return
([self.name isEqualToString:rhsValue.name] &&
// Compiler produces error: Error:(90, 36) no known instance method for selector 'isEqual:'
[self.attribute isEqual:rhs.attribute]);
}
@end
SomeProtocol 定义为:
@protocol SomeProtocol <NSObject>
@end
类扩展 SomeProtocol
:
@interface MyAttributeClass : NSObject <SomeProtocol>
@end
MyAttributeClass 实现协议 SomeProtocol
并且它有自己的 isEqual 并且当它的一个实例被 MyClass
存储在属性中时,我希望能够检查这些值是否是相当于.
分配给 MyClass 的是 MyAttributeClass:
MyClass *myClass = [[MyClass alloc] init];
myClass.name = "HAL";
myClass.attribute = [[MyAttributeClass alloc] init];
可能您忘记导入包含协议定义的 header。 (而不是只有前向声明。)在实现之前添加它。