创建使用两个类的协议

问题描述 投票:0回答:3

我有两个班,类似的东西

class FirstClass {

   func returnInt() -> Int {
       return (42)
   }
}

class SecondClass {

   func printInt(myInt: Int) {
    print(myInt)
   }
} 

我想知道是否有可能创建一个协议时的功能 - 的的Firstclass的“returnInt()>诠释”是调用,这样第二类“printInt(智力)”的功能调用。

在现实中,我正在从不同类别的序列化/反序列化包。

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

谢谢

swift macos serialization deserialization protocols
3个回答
1
投票

Closures

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

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

Delegate 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
投票

这应该这样做:

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

0
投票

在二等初始化你的类:

init(fromFirstClass returnInt: Int) {
    ....
}
© www.soinside.com 2019 - 2024. All rights reserved.