【发布时间】:2016-10-13 18:36:44
【问题描述】:
我有一个要升级到 Swift 3 的 iOS 框架。我希望 API 的方法签名遵循 Swift 3 约定,即为方法使用第一个命名参数,同时保持向后兼容性。很容易添加新的 API 方法签名并弃用旧的。但是,使用委托中使用的协议处理此问题的最佳方法是什么?
用于 Swift 2.x 的 API:
@objc(FooManager)
public class FooManager {
public var delegate: FooManagerDelegate?
public func saveFoo(foo: Foo) {
...
delegate?.didSaveFoo(foo)
}
...
}
@objc public protocol FooManagerDelegate {
@objc optional func didSaveFoo(foo: Foo)
}
Swift 3.x 的新 API:
@objc(FooManager)
public class FooManager {
public var delegate: FooManagerDelegate?
@available(*, deprecated, message: "use didSave(foo: foo)")
public func saveFoo(foo: Foo) {
...
delegate?.didSaveFoo(foo)
}
public func save(foo: Foo) {
...
delegate?.didSave(foo: foo)
}
...
}
@objc public protocol FooManagerDelegate {
@objc optional func didSaveFoo(foo: Foo)
@objc optional func didSave(foo: Foo)
}
上述解决方案可行,但它不会向继续使用旧委托方法的用户发出任何弃用警告。我可以创建一个新的委托并弃用旧的委托类,但最终我不得不使用非标准的委托类和属性命名。我不想让我的 FooManager 看起来像这样丑陋:
public class FooManager {
@available(*, deprecated, message: "use swift3delegate")
public var delegate: FooDelegate?
public var swift3delegate: Swift3FooDelegate?
是否有任何更好的解决方案可以在保持向后兼容性的同时将用户迁移到新的协议方法签名?
【问题讨论】:
标签: swift delegates swift3 backwards-compatibility swift-protocols