gpt4 book ai didi

swift - 如何在 Swift 中使用 associatedtype 的协议(protocol)闭包中使用 Void 类型

转载 作者:行者123 更新时间:2023-12-04 17:36:40 25 4
gpt4 key购买 nike

我有一个小问题,我找不到一种优雅的方法来使用具有关联类型的闭包作为协议(protocol)中的 Void。

假设我有以下协议(protocol):

protocol MyProtocol {

associatedtype OutputDataType
associatedtype InputDataType

var isCompleted: ( (InputDataType) -> OutputDataType)? { get set }
}

现在我有一个符合此协议(protocol)的类,在闭包内具有 Void 类型,如下所示:

class MyClass: MyProtocol {
var isCompleted: ( () -> Void )? // Error: Type 'MyClass' does not conform to protocol 'MyProtocol'
}

所以我尝试了这个:

var isCompleted: ( (Void) -> Void )? // warning: When calling this function in Swift 4 or later, you must pass a '()' tuple; did you mean for the input type to be '()'?

并以这种“奇怪”的语法结束:

var isCompleted: ( (()) -> Void )?

或者这个冗长的:

typealias InputDataType = Void
var isCompleted: ( (InputDataType) -> Void )?

但是现在当我想在其他类中分配这个闭包时,我需要在参数中明确使用“_”:

myClass.isCompleted = { _ in
// other code
}

不可能使用这样的东西:

myClass.isCompleted = {
// other code
}

那么你知道是否有可能得到像我引用和期望的例子那样更优雅的东西吗?

最佳答案

因为您已经通过协议(protocol)声明了必要的 isCompleted,您将不得不在 MyClass 中实现它,不幸的是使用了“奇怪”的语法。

然而,为了更好地使用它,您可以为 InputDataType == Void 时的协议(protocol)添加一个扩展,它可以方便地访问 isCompleted 而无需显式通过 Void... 像这样:

extension MyProtocol where InputDataType == Void {
var isCompleted: (() -> OutputDataType)? {
get {
guard let isCompleted = self.isCompleted else { return nil }
return { return isCompleted(()) }
}
set {
if let newValue = newValue {
self.isCompleted = { _ in return newValue() }
} else {
self.isCompleted = nil
}
}
}
}

然后您可以通过便利在您的类上使用该方法,这为您提供了您正在寻找的最后一个代码示例:

var myClass = MyClass()
myClass.isCompleted = {
print("Hello World!")
}
myClass.isCompleted?()

关于swift - 如何在 Swift 中使用 associatedtype 的协议(protocol)闭包中使用 Void 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56457944/

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