如果你有这样的协议:
protocol Messaging { func sendMessage(message: String) }
有没有办法在类这样的类中满足它:
class Messager: Messaging { func sendMessage(message: String, count: Int = 1) {} }
这将是很好的,因为通过添加默认参数来满足协议的结果签名.有没有办法让它与Swift 2一起使用?
这是一个简化的例子.让我们说,为了论证,协议是固定的.解决方案只能更新Messager类.我的目标是能够sendMessage()
像这样打电话:
let m: Messaging = Messager() m.sendMessage("")
我发现完成这个(并满足编译器)的唯一方法是重载,如下所示:
class Messager: Messaging { func sendMessage(message: String) { self.sendMessage(message, count: 1) } func sendMessage(message: String, count: Int = 1) {} }
这种方法的问题是我的默认值然后在两个地方指定,我失去了Swift默认参数的主要优点.
在Swift 3中你可以使用扩展来解决这个问题,但它有点难看.希望在下一个快速版本中获得更好的解决方案.
import UIKit protocol TestProtocol { func testFunction(a:Int, b:Int?) -> String } extension TestProtocol { func testFunction(a:Int, b:Int? = nil) -> String { return testFunction(a:a, b:b) } } class TestClass: TestProtocol { func testFunction(a:Int, b:Int?) -> String { return "a:\(a), b:\(b)" } } func testit(testProtocol: TestProtocol) { print(testProtocol.testFunction(a:10)) // will print a:10, b:nil print(testProtocol.testFunction(a:10, b:20)) // will print a:10, b:Optional(20) } let t = TestClass() testit(testProtocol: t)
如果有人仍在寻找答案,这个链接帮助我:
https://oleb.net/blog/2016/05/default-arguments-in-protocols/
基本上,原始函数定义包括您需要的所有参数:
protocol Messaging { func sendMessage(message: String, count: Int) }
并且您的扩展提供默认值,使用这些默认值调用原始协议函数:
extension Messaging { func sendMessage(message: String, count: Int = 1) { sendMessage(message, count) } }
使用Swift 2,您现在可以像这样扩展协议并为其提供默认实现
protocol Messageable { func sendMessage(message: String) } extension Messageable { func sendMessage(message: String, count: Int = 1) { // Do your default implementation } }
我还在了解这一点,所以我不能100%确定这对你的发送消息示例有什么用处,但我相信这就是你要找的东西.
你可以用swift 2中的协议做很多新的酷事.
观看苹果的演示文稿非常好
https://developer.apple.com/videos/play/wwdc2015-408/
并阅读这些
http://matthijshollemans.com/2015/07/22/mixins-and-traits-in-swift-2/
http://code.tutsplus.com/tutorials/protocol-oriented-programming-in-swift-2--cms-24979
http://www.raywenderlich.com/109156/introducing-protocol-oriented-programming-in-swift-2