当前位置:  开发笔记 > IOS > 正文

是否有可能满足Swift协议并添加默认参数?

如何解决《是否有可能满足Swift协议并添加默认参数?》经验,为你挑选了3个好方法。

如果你有这样的协议:

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默认参数的主要优点.



1> hhamm..:

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)



2> 小智..:

如果有人仍在寻找答案,这个链接帮助我:

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)
    }
}


在我脑海中,这创造了一个无限循环:)

3> crashoverrid..:

使用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

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有