簡體   English   中英

iOS Swift:符合協議的對象數組:如何檢查數組是否包含

[英]iOS Swift: Array of Objects conforming to a Protocol: How to check if array contains

我正在嘗試實現圖像下載器類。 這是一個單例實現。 想法是要求實例下載圖像並注冊為該圖像下載的觀察者。 到目前為止,這是我想出的:

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'

任何幫助深表感謝

您沒有將正確的參數傳遞給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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM