首页 > 解决方案 > 通用异步数组的 enumerate() 方法

问题描述

您好我尝试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()为我的自定义类实现方法?

标签: arraysswiftgenericsdispatch

解决方案


您分配给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!
    }
}

推荐阅读