【问题标题】:swift, objective-c protocol implementation快速,objective-c 协议实现
【发布时间】:2014-09-23 04:18:38
【问题描述】:

还在努力适应swift,但是由于我的obj-c知识接近于0,所以一直没能实现这个SocketRocket协议。任何帮助将不胜感激

这是我尝试实现的 obj-c 委托

@protocol SRWebSocketDelegate <NSObject>

// message will either be an NSString if the server is using text
// or NSData if the server is using binary.
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message;

@optional

- (void)webSocketDidOpen:(SRWebSocket *)webSocket;
- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;
- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;

@end

我希望这是实现它的正确方法;不是……
我得到 'SocketDelegate' 不符合协议 'SRWebSocketDelegate'

class SocketDelegate:UIViewController, SRWebSocketDelegate{
    let socket:SRWebSocket! = SRWebSocket()

    override func loadView() {
        self.socket.delegate = self
    }    

    func didReceiveMessage(message:AnyObject){

    }
}

【问题讨论】:

  • func webSocket(webSocket: SRWebSocket!, didReceiveMessage message: AnyObject!)
  • 为什么你在这方面做得这么好,而我却这么糟糕......不过说真的,谢谢

标签: ios objective-c swift protocols


【解决方案1】:

答案是:

func webSocket(webSocket: SRWebSocket!, didReceiveMessage message: AnyObject!)

Functions in Swift Reference Book

Obj-C中的方法名webSocket:didReceiveMessage翻译如第一部分是方法名,其他部分是外部参数名(didReceiveMessage)。另请注意,id 变为 AnyObject 并且 Obj-C 引用被转换为 ! 作为隐式解包的选项(这不再是真的,由于添加到 Obj-C 声明的属性,隐式解包的选项现在很少见了)。

【讨论】:

  • 我真正的问题不是 swift(ECMA 程序员),而是理解 obj-c,我真的需要做得更好。感谢您的帮助!
【解决方案2】:

另一种解决方案:尝试Starscream - 一个原生 Swift Websocket 库。

【讨论】: