2015-11-11 18 views
0

在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 

昨天晚上我試圖用斯威夫特陣列(不NSMutableArray的),將其轉換爲迅速,但檢查時,我結束了完全令人沮喪:

array.contains(theObject) 

爲了更好地瞭解雨燕這將幫助我,如果有人可以轉換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)拋出 - >布爾'

問題是。我只是不知道是什麼意思......我的第一個想法是。載有()需要一個函數,而不是一個實例/對象,但我不知道如何實現......

+0

顯示您嘗試的代碼和錯誤/問題(使用編譯消息或堆棧跟蹤) – Wain

+0

@Wain參見上面 –

回答

0

這不是一個有用的錯誤信息...

什麼意思是,爲了檢查數組是否包含某些東西,編譯器需要能夠比較它們。目前,對象只響應一個簡單的協議,所以編譯器不知道如何比較它們。

你的協議需要延長Equatable,並根據您遵守本協議的對象是什麼,你可能需要實現平等的功能。

相關問題