使用两个 类 创建协议

Create a protocol using two classes

我有两个class,类似的东西

class 首先Class {

func returnInt() -> Int { return (42) } } class SecondClass { func printInt(myInt: Int) { print(myInt) } }

我想知道当第一个Class的函数"returnInt() -> Int"被调用时是否可以创建一个协议,所以第二个Class的函数"printInt(Int)" 正在调用。

实际上,我正在研究来自不同 classes 的数据包的序列化/反序列化。

我认为这是最好的方法,这就是为什么我需要你的帮助。

谢谢

闭包

我不知道你的确切用法,但一种方法是使用闭包而不是协议。先在里面创建闭包变量class,返回值后再调用

class FirstClass {

    var valueReturned: ((Int)->Void)?

    func returnInt() -> Int {
        let value = 42
        valueReturned?(value)
        return value
    }
}

然后在某个地方你有两个实例的引用 classes set first 的 valueReturned 和内部闭包说当这将被调用时,你想调用 printInt(myInt:) of第二个和作为参数传递值来自闭包

firstClass.valueReturned = { value in // assign parameter of closure
    self.secondClass.printInt(myInt: value)
    // self.printInt(myInt: value)
}

委托模式

无论如何,如果你想使用协议,你将需要委托模式。

从声明协议开始

protocol FirstClassDelegate: class {
    func printInt(myInt: Int)
}

然后先在内部创建委托变量class并在返回值后调用委托方法

class FirstClass {

    weak var delegate: FirstClassDelegate?

    func returnInt() -> Int {
        let value = 42
        delegate?.printInt(myInt: value)
        return value
    }
}

现在将此委托协议实施到第二个 class 并将某些第一个 class 实例的 delegate 属性 设置为 self

class SecondClass {

    var firstClass = FirstClass()

    init() {
        firstClass.delegate = self
    }
}

extension SecondClass: FirstClassDelegate {
    func printInt(myInt: Int) {
        print(myInt)
    }
}

在 secondClass 中初始化你的 class:

init(fromFirstClass returnInt: Int) {
    ....
}

应该这样做:

class FirstClass {

    weak var firstClassToSecondClassCommunicatorDelegate: FirstClassToSecondClassCommunicator?

    func returnInt() -> Int {
        let myInt = 42
        if firstClassToSecondClassCommunicatorDelegate != nil {
            firstClassToSecondClassCommunicatorDelegate?.printInt(myInt: myInt)
        }
        return myInt
    }
}

class SecondClass: FirstClassToSecondClassCommunicator {
    func printInt(myInt: Int) {
        print(myInt)
    }
}

class myVC: UIViewController {
    override func viewDidLoad() {
        let firstClass = FirstClass()
        let secondClass = SecondClass()
        firstClass.firstClassToSecondClassCommunicatorDelegate = secondClass
    }
}

protocol FirstClassToSecondClassCommunicator {
    func printInt(myInt: Int)
}