使用两个类创建协议

时间:2019-02-05 15:10:52

标签: swift macos serialization deserialization protocols

我有两个班级

class FirstClass {

`php bin/console doctrine:mongodb:generate:documents AppBundle`

我想知道在调用FirstClass的函数“ returnInt()-> Int”以便调用第二个类“ printInt(Int)”的函数时是否可以创建协议。

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

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

谢谢

3 个答案:

答案 0 :(得分:1)

关闭

我不知道您的确切用法,但是一种方法是使用闭包而不是协议。在第一个类中创建闭包变量,然后在返回值后调用

class FirstClass {

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

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

然后在某个地方,您拥有两个类的两个实例的引用,它们分别设置为第一个valueReturned和内部闭包,表示在调用此函数时,您想调用第二个printInt(myInt:),并作为参数传递值从关闭

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

委托Patern

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

从声明协议开始

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

然后在第一个类中创建委托变量,并在返回值后在委托上调用方法

class FirstClass {

    weak var delegate: FirstClassDelegate?

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

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

class SecondClass {

    var firstClass = FirstClass()

    init() {
        firstClass.delegate = self
    }
}

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

答案 1 :(得分:1)

这应该做到:

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)
}

答案 2 :(得分:0)

在secondClass中,您可以通过以下方式初始化您的班级:

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