- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个小问题,我找不到一种优雅的方法来使用具有关联类型的闭包作为协议(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/
我一直在努力寻找在另一个关联类型中使用泛型和关联类型来解决上述问题的解决方案 案例 我想要一个ObjectRequestType,它里面有一个关联类型ObjectResponseType。 proto
这个问题在这里已经有了答案: Unable to use protocol as associatedtype in another protocol in Swift (2 个答案) Protoc
我一直在为这个问题苦苦思索 我正在尝试在 Swift 上创建一个绑定(bind)结构,以一种简单的方式绑定(bind) viewModel 和 Controller 。所以我创建了一个协议(proto
我正在尝试为我的 tableviewcells 设计一个面向协议(protocol)的 MVVM。我有很多。 我的 viewModel protocol PlainTableViewCellModel
这个问题在这里已经有了答案: Unable to use protocol as associatedtype in another protocol in Swift (2 个答案) 关闭 4 年
假设我有一个协议(protocol): protocol Router { associatedtype Answer typealias AnswerCallback = (Answ
在 swift 协议(protocol)中使用 generic with function 或使用 associatedType 有什么区别? protocol Repository { as
我来自 Java,我在学习模式方面没有什么困难。 我有第一个协议(protocol) protocol Interval { } 第二个: protocol Event { associate
我在使用关联类型作为协议(protocol)时遇到问题: protocol Searchable{ func matches(text: String) -> Bool } protoc
我有一个非常具体的问题,我无法通过 SO 上的给定答案解决这个问题。为了简化这个问题,我删除了所有不需要的东西。此代码仅显示理解问题所需的一切: 所以我有一个看起来像这样的类: class DataS
在设计 API 时,我在每个角落都会遇到这个问题: Protocol can only be used as a generic constraint because it has Self or a
所以这里我有这个协议(protocol) public protocol UseCase { associatedtype ResponseType associatedtype Pa
我正在使用一个库,它定义了两个协议(protocol),A 和 B,每个协议(protocol)都有它的 associatedtype T,像这样: protocol A { associat
这个有效: protocol Inconceivable { associatedtype AbstractType func say(it: AbstractType) } clas
我有一个协议(protocol) RequestType,它有如下所示的 associatedType 模型。 public protocol RequestType: class { ass
我正在尝试使用 MVVM 向 iOS 应用程序添加一些基类,以使其更容易并强制执行公共(public)类关系。 遗憾的是,我遇到了以下问题: error: MyPlayground.playgroun
这个问题在这里已经有了答案: Protocol doesn't conform to itself? (3 个答案) 关闭 3 年前。 我有以下代码: protocol User { var
我有一个小问题,我找不到一种优雅的方法来使用具有关联类型的闭包作为协议(protocol)中的 Void。 假设我有以下协议(protocol): protocol MyProtocol { as
当我在 Playground xcode 9.2 上运行时,苹果文档代码中出现上述错误 https://developer.apple.com/library/content/documentatio
我是一名优秀的程序员,十分优秀!