如何使用协议函数作为块定义


函数b调用a并传递一个完成块:
func a(completion: (_ succeeded: Bool)) {
completion(true)
}
func b() {
a() { succeeded in
...
}
}

我可以使用协议函数定义来定义块吗?

类似这样的东西(不起作用(:

protocol P {
func c(succeeded: Bool)
}
func a(completion: P) {
completion.c(succeeded: true)
}
func b() {
a() { c(succeeded) in
...
}
}

注意:我不是在寻找协议/委派的概念。

这里使用协议的问题是函数不能符合协议,只有类、枚举和结构才能符合协议。因此,您要么需要这些类型中的一个,要么需要其中一个类型的实例,但该实例似乎是多余的。如果你真的想这样做,这里的协议方式是一个枚举上静态一致性的例子:

import UIKit
protocol Callable {
static func call(someString: String, someInt: Int)
}
enum MyCallable: Callable {
static func call(someString: String, someInt: Int) {
print(someString, someInt)
}
}
func someFunction<T: Callable>(callable: T.Type) {
callable.call(someString: "a",someInt: 1)
}
someFunction(callable: MyCallable.self)

如果您想要的是一个带标签的元组,那么您可以使用它为自己提供参数标签。下面是一个操场示例:

import UIKit
typealias MyArguements = (someInt: Int, someString: String)
func someFunction( completion: @escaping (MyArguements) -> Void) {
completion((someInt: 1, someString: "a"))
}
someFunction { tuple in
let (someInt, someString) = tuple
print(someInt, someString)
}

最新更新