Swift 2:UITableViewDataSource 协议扩展

Posted

技术标签:

【中文标题】Swift 2:UITableViewDataSource 协议扩展【英文标题】:Swift 2: UITableViewDataSource protocol extension 【发布时间】:2015-09-15 09:36:41 【问题描述】:

我一直在玩协议扩展,但遇到了问题。也许我想要达到的目标无法完成。我有这个游乐场:

//: Playground - noun: a place where people can play

import UIKit

protocol ArrayContainer 
    typealias T
    var array: [T]  get 


class MyViewController: UIViewController, ArrayContainer, UITableViewDataSource 
    typealias T = String
    var array = ["I am", "an Array"] 


extension UITableViewDataSource where Self: ArrayContainer 

    func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return array.count
    

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        // Whatever
        return UITableViewCell()
       

这是我所拥有的,也是我想要的:

我有一个协议 ​ArrayContainer​,它只有一个 typealias 和一个包含此 typealias 类型对象的数组 我有一个UITableViewDataSource​的协议扩展,当类符合ArrayController​协议时使用。这只是将数组的项目数作为行数返回。 cellForRowAtIndexPath 方法没有很好的实现,但这不是问题。 我有一个名为MyViewController​的​UIViewController​子类,它实现了这两种协议。

问题是编译器抱怨因为 MyViewController 不符合 UITableViewDataSource 但据我所知,它应该被 UITableViewDataSource 扩展覆盖。我在这里错过了什么吗?或者可能无法扩展 Objective-C 协议?

【问题讨论】:

问题可能与***.com/questions/32542362/…有关 我很确定问题在于不能通过 Objective-C 访问协议扩展,并且 UITableViewDataSource 实现需要 ObjC 可访问。 是的,我认为这是问题所在,但它是否记录在任何地方? Swift 中的协议扩展目前不支持动态调度。 @ManueGE 我在下面添加了一个实用的实现。如果您认为这对您有用,您介意将其标记为已接受的答案吗?我不确定问这是否是不好的礼仪,所以请告诉我。 【参考方案1】:

我知道现在回复有点晚了,您甚至可能都没有在寻找这个答案,但我刚刚遇到了这个确切的问题,需要一个现实世界的“解决方案”。您可以在类中实现 UITableViewDataSource 方法,然后立即将工作交给协议扩展,如下例所示。如果 swift 进行了不再需要的改进,则可以很容易地改回原始帖子中的代码。

//: Playground - noun: a place where people can play

import UIKit

protocol ArrayContainer 
    associatedtype T
    var array: [T]  get 


class MyViewController: UIViewController, ArrayContainer, UITableViewDataSource 
    typealias T = String
    var array = ["I am", "an Array"]

    func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return self.internal_numberOfSectionsInTableView(tableView)
    

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return self.internal_tableView(tableView, numberOfRowsInSection: section)
    

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        return self.internal_tableView(tableView, cellForRowAtIndexPath: indexPath)
    


extension UITableViewDataSource where Self: ArrayContainer 

    func internal_numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    

    func internal_tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return array.count
    

    func internal_tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        // Whatever
        return UITableViewCell()
       

【讨论】:

这不是我所期望的,但我认为这是目前唯一的选择。

以上是关于Swift 2:UITableViewDataSource 协议扩展的主要内容,如果未能解决你的问题,请参考以下文章

获取 JSON 数据以从数组中填充 TableView

swift swift_optional2.swift

从 Swift 3.0 转换为 Swift 2.3

Swift入门系列--Swift官方文档(2.2)--中文翻译--About Swift 关于Swift

将版本更改为 Swift 1.2 而不是 Swift 2.1

将 swift 2.3 转换为 swift 3 错误