gpt4 book ai didi

swift - 是否可以满足 Swift 协议(protocol)并添加默认参数?

转载 作者:IT王子 更新时间:2023-10-29 05:02:08 27 4
gpt4 key购买 nike

如果你有这样的协议(protocol):

protocol Messaging {
func sendMessage(message: String)
}

有没有办法在这样的类中满足它:

class Messager: Messaging {
func sendMessage(message: String, count: Int = 1) {}
}

如果有这个就好了,因为通过添加默认参数可以满足协议(protocol)的最终签名。有什么方法可以让它与 Swift 2 一起使用吗?

这是一个简化的例子。假设,为了争论,协议(protocol)是固定的。解决方案只能更新 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 中,您可以使用扩展来解决这个问题,但它有点难看。希望在下一个 swift 版本中有更好的解决方案。

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)

但是,这会以某种方式导致一个问题。如果某个类不符合协议(protocol),它不会导致编译错误,而是会导致无限循环。

稍微好一点的解决方案(在我看来)是将默认参数封装在第二个函数中,如下所示:

import Foundation

protocol TestProtocol {
func testFunction(a: Int, b: Int?) -> String
}

extension TestProtocol
{
// omit the second parameter here
func testFunction(a: Int) -> String {
return testFunction(a: a, b: nil) // <-- and use the default parameter here
}
}

class TestClass: TestProtocol
{
func testFunction(a: Int, b: Int?) -> String
{
return "testFunction(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)
}
print(Date())
let t = TestClass()
testit(testProtocol: t)

这样当一个类不符合协议(protocol)时,编译器会通知,也不会死循环。

关于swift - 是否可以满足 Swift 协议(protocol)并添加默认参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34601931/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com