【问题标题】:Working with Swift Arrays - How to implement an Array of Objects conforming to a protocol使用 Swift 数组 - 如何实现符合协议的对象数组
【发布时间】:2015-11-11 07:54:33
【问题描述】:

在 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)

编译器说:

无法将“RPSceneDelegate”类型的值转换为预期参数 键入'@noescape (RPSceneDelegate) 抛出 -> Bool'

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

【问题讨论】:

  • 显示您尝试过的代码以及您遇到的错误/问题(带有编译消息或堆栈跟踪)

标签: objective-c swift delegates protocols


【解决方案1】:

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

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

您的协议需要扩展Equatable,并且根据您的符合此协议的对象的具体情况,您可能需要实现相等函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多