2014-12-03 46 views
0

我試圖實現圖像下載類。這是一個單例實現。這個想法是讓實例下載一個圖像並註冊爲該圖像下載的觀察者。這是我想出了迄今:iOS Swift:符合協議的對象數組:如何檢查數組是否包含

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'

任何幫助非常感謝

+0

在這行是錯誤? – jrturton 2014-12-03 22:00:07

+0

if(!contains(observerList,delegate)) – Django 2014-12-03 22:14:12

回答

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 
    } 
} 
+0

不是'觀察者中的觀察者===委託'比較類型爲[ImageDownloaderDelegate]的數組和符合ImageDownloaderDelegate的對象嗎? – Django 2014-12-03 22:36:15

+0

不,這是比較符合ImageDownloaderDelegate的兩個對象。你應該看看'contains'的文檔,並閱讀閉包的工作方式。 – Lance 2014-12-03 22:44:42

+0

謝謝,這非常有幫助 – Django 2014-12-03 23:01:27

相關問題