在 class 和视图控制器 Swift 之间使用协议 3

Use a protocol between a class and a view controller Swift 3

我使用库 SwiftSocket 将消息发送到我的服务器。建立连接后,我想创建一个回调来捕获结果。但是我的protocol一直是null,回调没有发送。

这是我的 TCPClient class :

protocol ProtocolTCPClient {
    func connexionSucceeded()
}

class UtilsTCPClient {

    var delegate: ProtocolTCPClient?

    let client: TCPClient?

    init(address: String, port: Int32) {
        client = TCPClient(address: address, port: port)
        switch client!.connect(timeout: 5) {
        case .success:
            print("Success")
            if(delegate != nil){
                self.delegate?.connexionSucceeded()//never called
            } else{
                print("delegate nil")
            }
        case .failure(let error):
            print("Error: ")
            print(error)
        }
    }
}

这是我的ViewController

import UIKit
import SwiftSocket

class ViewController: UIViewController, ProtocolTCPClient {

    var client: UtilsTCPClient?

    override func viewDidLoad() {
        super.viewDidLoad()

        self.client = UtilsTCPClient(address: "server", port: 80)
        self.client?.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func connexionSucceeded(){
        print("Connexion succeeded")//never called
    }
 }

感谢您的回答

你的代码应该看起来像 this.Because 在你的代码中首先你初始化 'UtilsTCPClient' 然后分配委托。在 'UtilsTCPClient' 中,您创建 'TCPClient' 并尝试访问委托,但直到它没有被分配,所以您应该尝试下面的代码。

       protocol ProtocolTCPClient {
    func connexionSucceeded()
}

class UtilsTCPClient {

    var delegate: ProtocolTCPClient?

    let client: TCPClient?

    init(address: String, port: Int32, delegate: ProtocolTCPClient) {

        self.delegate = delegate

        client = TCPClient(address: address, port: port)

        switch client!.connect(timeout: 5) {
        case .success:
            print("Success")
            if(delegate != nil){
                self.delegate?.connexionSucceeded()
            } else{
                print("delegate nil")
            }
        case .failure(let error):
            print("Error: ")
            print(error)
        }

    }


}


class ViewController: UIViewController, ProtocolTCPClient {

    var client: UtilsTCPClient?

    override func viewDidLoad() {
        super.viewDidLoad()

        self.client = UtilsTCPClient(address: "server", port: 80, delegate: self)

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func connexionSucceeded(){
        print("Connexion succeeded")//never called
    }
}