如何比较 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。 (而不是只有前向声明。)在实现之前添加它。