Как использовать функцию протокола в качестве определения блока? - PullRequest
0 голосов
/ 31 октября 2019

Здесь функция 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
        ...
    }
}

Примечание: я не ищу концепцию протокола / делегата.

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Проблема с использованием протокола здесь заключается в том, что функции не могут соответствовать протоколу, только классы, перечисления и структуры могут соответствовать протоколу. Поэтому вам нужен либо один из этих типов, либо экземпляр одного из этих типов, но тогда этот экземпляр кажется излишним. Если вы действительно хотите сделать это по протоколу, вот пример со статическим соответствием для перечисления:

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)
1 голос
/ 31 октября 2019

Вы можете использовать помеченный кортеж, чтобы присвоить себе метку аргумента, если вы хотите этого. Вот пример детской площадки:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...