带有默认值的快速协议

时间:2018-12-05 04:57:23

标签: swift swift4 protocols

我正在通过重写自定义tableview实现来练习快速协议。

protocol PreviewModuleViewDataSource {
    func previewModuleView(_ moduleView: PreviewModuleView, numberOfItemsInSection section: Int) -> Int
    func previewModuleView(_ moduleView: PreviewModuleView, cellForItemAt indexPath: IndexPath) -> PreviewModuleViewItem
}

我有关于节中项目数的协议,在索引路径中有“项目的单元格”。

然后我像这样扩展协议:

func previewModuleView(_ moduleView: PreviewModuleView, numberOfItemsInSection section: Int) -> Int {
        return dataSource.count
    }

    func previewModuleView(_ moduleView: PreviewModuleView, cellForItemAt indexPath: IndexPath) -> PreviewModuleViewItem {

        let item = PreviewModuleViewItem()
        item.image = UIImage(named: "ItunesArtwork")

        return item

    }

我的问题是,我该如何在使用数据的核心类中实际获取“ dataSource.count”的值?

谢谢

1 个答案:

答案 0 :(得分:1)

我相信您是在问如何使用func previewModuleView(_ moduleView: PreviewModuleView, numberOfItemsInSection section: Int) -> Int对象中从PreviewModuleView返回的值?

protocol PreviewModuleViewDataSource: class {
    func previewModuleView(_ moduleView: PreviewModuleView, numberOfItemsInSection section: Int) -> Int
    func previewModuleView(_ moduleView: PreviewModuleView, cellForItemAt indexPath: IndexPath) -> PreviewModuleViewItem
}

class PreviewModuleView {
    weak var dataSource: PreviewModuleViewDataSource?

    func useValueExample() {
        if let numberOfItems = dataSource?.previewModuleView(self, numberOfItemsInSection: 0) {
            print("Number of items in section 0 = \(numberOfItems)")
        }
    }
}

例如,当您使用表格视图时,必须将View Controller分配为数据源。因此,您需要一个数据源变量来将委托分配给该变量。而且,当您要访问一个节中的项目数时,可以在数据源上调用该函数。

在此示例中,我将协议更改为class协议,并使数据源变量变弱,我建议这样做。