iOS Swift:符合协议的对象数组:如何检查数组是否包含

时间:2014-12-03 21:56:55

标签: ios swift delegates protocols

我正在尝试实现图片下载器类。这是一个单例实现。想法是要求实例下载图像并注册为该图像下载的观察者。这是我到目前为止所提出的:

public protocol ImageDownloaderDelegate {
    func imageDownloadFinished(success: Bool)
}

public class ImageDownloader {
    var list: [Int64] = []
    var observer: [Int64:[ImageDownloaderDelegate]] = [:]
    var downloading: Bool = false

    public func downloadImageWithId(immutableId: Int64, delegate: ImageDownloaderDelegate) {
        // Add Id to download list
        if (!contains(list, immutableId)) {
            list.append(immutableId)
        }

        // Add Observer
        var observerList = observer[immutableId]
        if (observerList == nil) {
            observerList = [delegate]
        } else if (!contains(observerList, delegate)) {
            observerList!.append(delegate)
        }
        observer[immutableId] = observerList

        // Start to download
        if (!downloading) {
            self.downloadNextImage()
        }
    }

    private func downloadNextImage() {
        ...
    }

    /// A shared instance of the class
    public class var defaultImageDownloader: ImageDownloader {
        struct Singleton {
            static let instance = ImageDownloader()
        }
        return Singleton.instance
    }
}

我收到以下错误:

'ImageDownloaderDelegate'无法转换为'S.Generator.Element - > L'

非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

您没有将正确的参数传递给contains函数,该函数需要集合和谓词(闭包)。

你需要做

public protocol ImageDownloaderDelegate : class {
    func imageDownloadFinished(success: Bool)
}

public class ImageDownloader {
    var list: [Int64] = []
    var observer: [Int64:[ImageDownloaderDelegate]] = [:]
    var downloading: Bool = false

    public func downloadImageWithId(immutableId: Int64, delegate: ImageDownloaderDelegate) {
        // Add Id to download list
        if (!contains(list, immutableId)) {
            list.append(immutableId)
        }

        // Add Observer
        var observerList = observer[immutableId]
        if (observerList == nil) {
            observerList = [delegate]
        } else if !contains(observerList!, { observer in observer === delegate }) {
            observerList!.append(delegate)
        }
        observer[immutableId] = observerList

        // Start to download
        if (!downloading) {
            self.downloadNextImage()
        }
    }

    private func downloadNextImage() {
        ...
    }

    /// A shared instance of the class
    public class var defaultImageDownloader: ImageDownloader {
        struct Singleton {
            static let instance = ImageDownloader()
        }
        return Singleton.instance
    }
}