[Swift设计模式] 委托代理

433 阅读2分钟
更多内容,欢迎关注公众号:Swift花园
喜欢文章?不如来点赞关注吧

委托代理设计模式一种相对易用的两个对象间通信的方式。

 

实现 Swift 中的委托代理

委托协议:一个委托者将任务委派出去,一个代理对象实现委托协议,完成”老板“交待的工作。让我们翻译成人话。

客户反馈Bug,项目经理创建 issue,告知开发尽快修复Bug。

这就是委托代理。当某个节点事件发生时,委托者利用通用接口(描述问题的 issue),指定外部资源(这里的开发)完成某事。 (修复 🐛)。

举个代码示例吧。

#!/usr/bin/env swift

import Foundation


protocol InputDelegate {

    var shouldContinueListening: Bool { get }

    func didStartListening()
    func didReceive(input: String)
}


class InputHandler {

    var delegate: InputDelegate?

    func listen() {
        self.delegate?.didStartListening()

        repeat {
            guard let input = readLine() else {
                continue
            }
            self.delegate?.didReceive(input: input)
        }
        while self.delegate?.shouldContinueListening ?? false
    }
}


struct InputReceiver: InputDelegate {

    var shouldContinueListening: Bool {
        return true
    }

    func didStartListening() {
        print("👻 \"hi\", 离开时请说 \"bye\":")
    }

    func didReceive(input: String) {
        switch input {
        case "hi":
            print("🌎 Hello world!")
        case "bye":
            print("👋 Bye!")
            exit(0)
        default:
            print("🔍 找不到命令,请重试:")
        }
    }
}

let inputHandler = InputHandler()
let inputReceiver = InputReceiver()
inputHandler.delegate = inputReceiver
inputHandler.listen()

想象一下,Apple 在底层其实做着一样的事情,比如 UICollectionViewDataSource, UICollectionViewDelegate 等等。你只需要实现代理,而它们提供协议和委托者。🤔

 

Weak属性,委托和类

内存管理是一件很重要的事,因为值得一提的是:类的所有代理对象都应该是 weak 属性,否则你可能会陷入糟糕的引用循环。😱

protocol InputDelegate: class { /*...*/ }

class InputHandler {

    weak var delegate: InputDelegate?
    
    /*...*/
}

class InputReceiver: InputDelegate {
    /*...*/
}

如你所见,委托代理其实很简单,但使用时也要注意规避风险。通过提供可以由任何人实现的普通接口,它帮助解耦代码。关于委托代理的文章其实很多,这里就不再赘述了。

 

我的公众号
这里有Swift及计算机编程的相关文章,以及优秀国外文章翻译,欢迎关注~