Swift делегат как параметр функции - PullRequest
0 голосов
/ 01 ноября 2018

Я создал свой протокол, как показано ниже:

import Foundation
protocol ITcpCLient: class {
    func OnMessageReceived(_ message: String);
}

Класс, использующий протокол, как показано ниже:

import Foundation

class tcpConnection {
    var tcpClientdelegate: ITcpCLient?

    init(client: ITcpCLient) {
        self.tcpClientdelegate? = client

        if self.tcpClientdelegate == nil {
            print("tcpClient Delegate is nil!")
        }
    }

    func trigger() {
        tcpClientdelegate?.OnMessageReceived("From Trigger")
    }

}

Мой класс ViewController ниже:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        print("viewDidLoad!")
        let myTcpConnection = tcpConnection(client: self)
        myTcpConnection.trigger()
    }


}


extension ViewController: ITcpCLient {

    func OnMessageReceived(_ message: String) {
        print("onMessageReceived")
        print(message)
    }

}

Вывод: tcpClient Delegate равен нулю! Если я создаю делегат без знака вопроса, код работает как положено. Но когда я использую необязательный тип, я не могу назначить класс viewcontroller в качестве делегата.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Проблема заключается в init:

self.tcpClientdelegate? = client

Оператор постфикса ? не будет выполнять какую-либо операцию, указанную вами, если его операнд равен nil.

Здесь self.tcpClientdelegate - ноль, поэтому значение не назначено.

Из справочника по языку Swift :

Необязательные выражения-цепочки должны появляться в выражении постфикса, и они вызывают выражение постфикса в специальном путь. Если значение необязательного выражения-цепочки равно nil, все другие операции в выражении постфикса игнорируются и полное выражение постфикса оценивается как ноль.

Просто назначьте его как обычно, чтобы решить проблему, потому что вас не волнует, было ли self.tcpClientdelegate nil или нет:

self.tcpClientdelegate = client
0 голосов
/ 01 ноября 2018

Так как self.tcpClientdelegate равно nil, то добавление оператора ? приведет к тому, что весь оператор не будет выполнен =>, что приведет к тому, что этот делегат будет отменен = nil

self.tcpClientdelegate? = client

поэтому замените на

self.tcpClientdelegate = client
...