【发布时间】: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