метод enumerate () для универсального асинхронного массива - PullRequest
0 голосов
/ 05 июля 2018

Привет! Я пытаюсь создать метод enumerate() для своего пользовательского асинхронного массива, но все еще есть ошибка компиляции. Мой пользовательский класс выглядит так:

class AsyncArray<T> {

private var array = [T]()
private var queue = DispatchQueue(label: "async_queue", attributes: .concurrent)

    func enumerated() -> EnumeratedSequence<[T]> {
        var value = EnumeratedSequence<[T]>() // compilation error Cannot invoke initializer for type 'EnumeratedSequence<[T]>' with no arguments
        queue.sync {
            value = self.array.enumerated()
        }
        return value
    }
}

как я могу реализовать enumerated() метод для моего пользовательского класса?

1 Ответ

0 голосов
/ 05 июля 2018

Вы назначаете value только для немедленной перезаписи в вызове sync. Там нет необходимости.

DispatchQueue.sync позволяет вам напрямую вернуть результат:

import Dispatch

class AsyncArray<T> {
    private var array = [T]()
    private var queue = DispatchQueue(label: "async_queue", attributes: .concurrent)

    func enumerated() -> EnumeratedSequence<[T]> {
        return queue.sync {
            return self.array.enumerated()
        }
    }
}

Для справки: если вам нужно было присвоить захваченную переменную, как вы пытались это сделать (что было бы необходимо, например, для вызова async), это выглядело бы примерно так:

import Dispatch

class AsyncArray<T> {
    private var array = [T]()
    private var queue = DispatchQueue(label: "async_queue", attributes: .concurrent)

    func enumerated() -> EnumeratedSequence<[T]> {
        var result: EnumeratedSequence<[T]>?
        return someAsyncCall {
            result = self.array.enumerated()
        }
        waitForAsyncCallToFinish()
        return result!
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...