如何使用协议功能作为块定义?

问题描述 投票:0回答:2

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

注意:我不是在寻找协议/代理概念。

swift callback swift-protocols
2个回答
1
投票

如果您要这样做,可以使用带标签的元组为自己提供参数标签。这是一个游乐场示例:

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


0
投票

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

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)
© www.soinside.com 2019 - 2024. All rights reserved.