iOS swift : Array of Objects conforming to a Protocol: How to check if array contains

标签 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”

非常感谢任何帮助

最佳答案

您没有将正确的参数传递给 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
    }
}

关于iOS swift : Array of Objects conforming to a Protocol: How to check if array contains,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27282451/

相关文章:

c#如何获取添加的事件?

ios - 从 UITableView 在线保存数据的最佳方法是什么?

c++ - 从 Objective C 类调用 Objective C++ 方法

ios - 使用 AWS Amplify 从 iOS (Swift) 连接到 Dynamodb

ios - 在 Swift 中使用 Firebase 中的句柄删除观察者

objective-c - 不熟悉在 Mac 桌面上解决预填充文本字段的技术(无法访问 viewDidLoad 或类似方法)

ios - 禁用 UITextView 的放大镜但在 objective-c 中启用链接和电话号码检测

swift - 尝试对可选字符串进行日期格式化

macos - 如何从 Storyboard加载初始窗口 Controller ?

UIViewController 和 UIview dealloc 没有被调用