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

How to use a protocol function as block definition?

这里函数 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
        ...
    }
}

注意:我不是在寻找 protocol/delegate 概念。

如果您想要的话,您可以使用带标签的元组为自己指定参数标签。这是一个游乐场示例:

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

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

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)