在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()需要一个函数,而不是一个实例/对象,但我不知道如何实现它......
答案 0 :(得分:0)
这不是一个有用的错误消息......
意味着,为了检查数组是否包含编译器需要能够比较它们的内容。目前,对象只响应一个简单的协议,因此编译器不知道如何比较它们。
您的协议需要扩展Equatable
,并且根据您的对象符合此协议的确切内容,您可能需要实现相等功能。