Быстрое закрытие с несколькими параметрами - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь определить замыкание Swift с двумя аргументами, но оно вызывает ошибки компиляции.Что я делаю не так?

 var processor: (CMSampleBuffer, CVPixelBuffer) throws -> Void { (sampleBuffer, outputPixelBuffer) in
    ....
}

РЕДАКТИРОВАТЬ: Отсутствует =, что было правильно указано в комментариях.Но сейчас я пытаюсь передать это закрытие как параметр, и оно дает ошибки компиляции в объявлении:

 func process(_ processor: ((_ sampleBuffer: CMSampleBuffer,  toPixelBuffer:CVPixelBuffer) throws)? = nil) {


 }

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Тип функции должен быть записан в следующем синтаксисе:

( ArgumentList ) throws -> ResultType

(Упрощенно, вы можете найти полное описание в ссылке выше.)

Ключевое слово throws является необязательным согласно вашему требованию, но -> ResultType требуется, даже если ResultType равен Void.

И ArgumentList не может иметь метки параметров, необходимо использовать _в качестве метки параметра, когда вы хотите показать имена параметров для удобства чтения.

Итак, ваш process(_:) должен выглядеть примерно так:

func process(_ processor: ((_ sampleBuffer: CMSampleBuffer,  _ toPixelBuffer: CVPixelBuffer) throws -> Void)? = nil) {
    //...
}

Или, если вы определите typealias дляТип параметра, вы можете переписать его следующим образом:

typealias ProcessorType = (_ sampleBuffer: CMSampleBuffer,  _ toPixelBuffer: CVPixelBuffer) throws -> Void

func process(_ processor: ProcessorType? = nil) {
    //...
}

Еще один, когда вы спрашиваете о ошибки компиляции , настоятельно рекомендуется показать полное сообщение об ошибке.

Вы можете найти копируемый текст с помощью Навигатора отчетов на панели Навигатора (вЛевая сторона Xcode).

0 голосов
/ 22 сентября 2018

Так что следующий код, кажется, проходит на игровой площадке:

func process(_ processor: ((String, String))? = nil) {

}

Я почти уверен, что главная проблема в том, что вы хотите использовать throws в качестве ключевого слова.Я не думаю, что это возможно каким-либо образом, я бы предпочел использовать шаблон Result enum, который выглядит примерно так:

enum ProcessResult {
    case success(someReturnValue: YourType) // Or no associated value if you just want to know it worked
    case failed(anError: Error)
}

Требуя, чтобы блок возвращал ProcessResult вы можете применить что-то, для чего вы можете использовать try / catch на других языках.

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