委托模式(delegation)是Swift生态系统中的一个关键模式,广泛用于在对象之间传递事件处理的责任。委托允许类将其部分行为委派给另一个对象(委托),通常通过协议来定义。
protocol DataUpdateDelegate: AnyObject { func didUpdateData(_ data: String) } class DataProvider { weak var delegate: DataUpdateDelegate? func updateData() { // ... 数据更新逻辑 delegate?.didUpdateData("新数据") } } class ViewController: UIViewController, DataUpdateDelegate { func didUpdateData(_ data: String) { print("数据更新了: \(data)") } }
weak(或unowned),以避免保留循环。AnyObject,以允许弱引用。如果您的委托是值类型(例如,结构体),您如何实现委托?
回答:
在Swift中,委托必须是引用类型(class或AnyObject),因为对于weak引用仅允许引用类型。委托不能是结构体或枚举,否则会出现问题:编译器不允许使用弱属性,而强引用将导致保留循环。
// 错误!不能将委托声明为结构体:编译器不允许将其设为弱 protocol StructDelegate { ... } struct MyStructDelegate: StructDelegate { ... } weak var delegate: StructDelegate? // 错误
故事
在一个项目中,忘记将委托属性标记为weak。结果,视图和委托之间发生了保留循环,应用程序的内存逐渐“膨胀”,并在运行半小时后崩溃。
故事
委托通过值类型(结构体)实现,而不是类。应该成为委托的IBOutlet没有收到通知——根本没有建立连接。这个问题只有在分析日志和调试时才发现。
故事
在项目中,委托协议没有继承AnyObject,而委托属性被声明为weak var。这导致了编译器错误,团队花了时间来理解和修复这一问题。