使用两个 类 创建协议
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)
}
我有两个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)
}