2014-09-12 5 views
1

나는 .H 파일의 코드가 있습니다스위프트 배열은 목표 - C에서

typedef void(^SocketConnectionLost)(); 
typedef void(^SocketIOCallback)(id argsData); 

@interface SocketConnection 

@property (strong, nonatomic) SocketIO *socketIO; 

@property (strong, nonatomic) NSMutableArray *socketConnectionLosts; 

-(void)sendEventWithName:(NSString*)eventName 
       withData:(id)data 
     onConnectionLost:(SocketConnectionLost)connectionLost 
       onAnswer:(SocketIOCallback)answer; 

@end 

을 그리고 내가하는 .m 파일의 코드가 있습니다

@implementation SocketConnection 

- (void)init { 
    self.socketIO = [[SocketIO alloc] initWithDelegate:self]; 
    [self.socketIO setReturnAllDataFromAck: YES]; 
    [self.socketIO connectToHost:kSocketHost onPort:kSocketPort withParams:params]; 
} 

- (void) socketIODidDisconnect:(SocketIO *)socket 
     disconnectedWithError:(NSError *)error { 
    for(ServerRequestConnectionLost connectionLost in self.socketConnectionLosts) 
     if(connectionLost) 
      connectionLost(); 
    [self.socketConnectionLosts removeAllObjects]; 
} 

-(void)sendEventWithName:(NSString*)eventName 
       withData:(id)data 
     onConnectionLost:(SocketConnectionLost)connectionLost 
       onAnswer:(SocketIOCallback)answer { 
    [self.socketConnectionLosts addObject:connectionLost]; 
    [self.socketIO sendEvent:eventName withData:data andAcknowledge:^(id argsData) { 
     if(connectionLost) 
      [self.socketConnectionLosts removeObject:connectionLost]; 
     if(answer) 
      answer(argsData); 
    }]; 
} 

@end 

날이 재현 도와주세요 Swift에서 코드를 작성, 추가 및 제거하는 방법을 모르겠다.

Swift에서 일부 블록을 만드는 방법은 다음과 같습니다.

형 '() ->()가'프로토콜에 확인하지 않습니다 'AnyObject'

가 그럼 난 [self.socketConnectionLosts removeObject처럼 배열에서 someBlock를 제거해야합니다 :

var someBlock:()->() 
var connectionLosts = NSMutableArray() 
connectionLosts.append(someBlock) 

컴파일러는 나에게 오류를 보여줍니다 connectionLost] obj-c와 나는 스위프트 배열로 그것을하는 방법을 이해하지 않는다.

답변

15

대용량 배열 인 objective-c 배열을 사용할 필요가 없습니다. 이것을 확인하십시오 :

놀이터에서 실행하면 마지막 줄에 Closure executed이 인쇄됩니다.

NSArray 작동하지 않는 이유는 신속한에서 AnyObject의 배열로 브리지됩니다 -하지만 AnyObject는 클래스 형의 인스턴스 이며, 분명히 폐쇄 하지 클래스입니다.

배열에서 항목을 제거하는 것은 더 복잡한 문제입니다. find은 배열 유형이 Equatable 프로토콜을 구현해야하므로 사용할 수 없지만 클로저는이를 구현하지 않으며 확장 할 수 없습니다.

배열을 사용하는 대신 사전을 사용할 수 있습니다. 사전을 사용할 수 있습니다. 예를 들어 텍스트 이름, 열거 형 등과 같이 앱 논리에 따라 의미있는 키 유형을 사용할 수 있습니다. 예를 들어, 열거 형 :

enum ClosureEnum { 
    case TEST_ELEMENT 
} 

var dict = [ClosureEnum:ClosureType]() 
dict[.TEST_ELEMENT] = someClosure 
dict[.TEST_ELEMENT]!() 

참고 사전에 조회가 항상 옵션을 반환하기 때문에 필요한 dict[.TEST_ELEMENT]!()에서 !. 이와 같이 강제로 언 래핑을 사용하거나보다 안전한 코드를 만들기 위해 선택적으로 바인딩으로 묶을 수 있습니다.

dict.removeValueForKey(.TEST_ELEMENT) 
+0

감사 :

은 적절한 방법을 사용하여 요소를 제거하려면! 그리고 array :: array.filter ({$ 0! = someClosure})에서 어떻게 제거 할 수 있는지 알려주세요.하지만 컴파일러는 다음과 같이 입력하십시오 : 'ClosureType'이 'Equatable'프로토콜을 따르지 않음 –

+1

업데이트 된 답변보기 – Antonio

+0

감사합니다. 당신의 포괄적 인 대답을위한 당신 !!!! ^^ –