我有两个班级
class FirstClass {
`php bin/console doctrine:mongodb:generate:documents AppBundle`
我想知道在调用FirstClass的函数“ returnInt()-> Int”以便调用第二个类“ printInt(Int)”的函数时是否可以创建协议。
实际上,我正在研究来自不同类的数据包的序列化/反序列化。
我认为这是最好的方法,这就是为什么我需要您的帮助。
谢谢
答案 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)
}
无论如何,如果要使用协议,则需要使用委托模式。
从声明协议开始
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) {
....
}