使用Swift数组 - 如何实现符合协议的对象数组

时间:2015-11-11 07:54:34

标签: objective-c swift delegates protocols

在Objective-C中,我经常使用以下"设计模式"在我的代码中"广播"场景输入回调:

@protocol RPSceneDelegate <NSObject>
-(void)someMethod;
-(void)didTap;
@end

@interface RPScene : SKScene
@property (nonatomic, strong) NSMutableArray<id<RPSceneDelegate>>* delegates;
-(void)addDelegate:(id<RPSceneDelegate>)delegate_;
-(void)removeDelegate:(id<RPSceneDelegate>)delegate_;
@end

@implementation RPScene

#pragma mark - Delegate Handling

-(void)addDelegate:(id<RPSceneDelegate>)delegate_ {

    if ([self.delegates containsObject:delegate_]) return;
    [self.delegates addObject:delegate_];
}

-(void)removeDelegate:(id<RPSceneDelegate>)delegate_ {

    if (![self.delegates containsObject:delegate_]) return;
    [self.delegates removeObject:delegate_];
}

-(void)didTap {

    for (id<RPSceneDelegate> delegate_ in self.delegates) {

        // Just a small example to show what I am doing
        [delegate_ performSelector:@selector(didTap)];
    }
}

@end

昨晚我尝试使用Swift-Arrays(不是NSMutableArray)将其转换为swift,但在检查时我最终感到非常沮丧:

array.contains(theObject)

为了更好地理解Swift,如果有人可以将这一小段代码转换为Swift,那将对我有所帮助。那么如何在Swift中实现它呢?

编辑:我在Swift中的代码

protocol RPSceneDelegate {
    func someMethod()
}

class RPScene: SKScene {

    var delegates = [RPSceneDelegate]()

    func addDelegate(delegate: RPSceneDelegate) {

        if !delegates.contains(delegate) {
            delegates.append(delegate)
        }
    }
}

可行的方法是:

delegates.append(delegate)

给我一​​个错误的是:

delegates.contains(delegate)

编译说:

  

无法转换类型&#39; RPSceneDelegate&#39;的值预期的论点   键入&#39; @noescape(RPSceneDelegate)throws - &gt;布尔&#39;

问题是。我只是不知道这意味着什么......我的第一个想法是.contains()需要一个函数,而不是一个实例/对象,但我不知道如何实现它......

1 个答案:

答案 0 :(得分:0)

这不是一个有用的错误消息......

意味着,为了检查数组是否包含编译器需要能够比较它们的内容。目前,对象只响应一个简单的协议,因此编译器不知道如何比较它们。

您的协议需要扩展Equatable,并且根据您的对象符合此协议的确切内容,您可能需要实现相等功能。