Какой самый "Swift-подобный" / чистый способ установить ненулевое значение с помощью syn c DispatchQueue? - PullRequest
4 голосов
/ 08 января 2020

У меня есть синхронный, одновременный DispatchQueue, который я использую, чтобы получить значение, чтобы оно сразу было доступно в потоке управления.

let isEmpty: Bool

dispatchQueue.sync {
    isEmpty = self.myProtectedArray.isEmpty
}

print(isEmpty) // error

Даже если оператором печати isEmpty всегда будет присвоено значение (из-за синхронности) компилятору Swift НЕ нравится это.

Как мне изменить его так, чтобы он был приемлем для компилятора Swift, но не являлся грубым решением? Начиная с var isEmpty: Bool = true кажется глупым, потому что "начальное значение" неясно.

1 Ответ

10 голосов
/ 08 января 2020

Метод синхронный DispatchQueue

func sync<T>(execute work: () throws -> T) rethrows -> T

возвращает результат рабочего элемента вызывающей стороне, что означает, что вы можете назначить его как значение инициализации для логической константы:

let isEmpty = dispatchQueue.sync {
    return self.myProtectedArray.isEmpty
}

print(isEmpty) // Compiler happy!

Как сказал @Rob, self. не требуется, поскольку замыкание не является экранирующим, а ключевое слово return может быть опущено в случае одного -выражение закрытия:

let isEmpty = dispatchQueue.sync {
    myProtectedArray.isEmpty
}
...