使用Swift的通用UITableViewDataSource

时间:2015-06-29 08:09:52

标签: swift uitableview generics

我正在尝试创建一个通用的UITableViewDataSource实现。在内部,DataSource实现使用NSFetchedResultsController来接收数据。这是我目前的代码。

extension UITableViewCell {
    class var reuseIdentifier: String {
        return toString(self).componentsSeparatedByString(".").last!
    }
}

class ManagedDataSource<CellType: UITableViewCell, ItemType>: NSObject, NSFetchedResultsControllerDelegate, UITableViewDataSource {

    // MARK: Properties

    var fetchRequest: NSFetchRequest {
        get {
            return fetchedResultsController.fetchRequest
        }
        set {
            fetchedResultsController = NSFetchedResultsController(fetchRequest: newValue, managedObjectContext: HMServicesManager.mainContext(), sectionNameKeyPath: nil, cacheName: nil)
        }
    }

    private var fetchedResultsController: NSFetchedResultsController {
        didSet {
            fetchedResultsController.delegate = self
        }
    }

    private let configureCell: (item: ItemType, cell: CellType) -> ()
    private weak var tableView: UITableView?

    // MARK: Initialization

    init(fetchRequest: NSFetchRequest,
        tableView: UITableView,
        tableViewCellType cellType: CellType.Type,
        itemType: ItemType.Type,
        configureCell: (item: ItemType, cell: CellType) -> ()) {
            self.tableView = tableView
            self.configureCell = configureCell
            fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: HMServicesManager.mainContext(), sectionNameKeyPath: nil, cacheName: nil)
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier(CellType.reuseIdentifier, forIndexPath: indexPath) as! CellType
        return cell
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 0
    }


}

UITableViewDataSource实现和NSFetchedResultsControllerDelegate实现目前尚未完成,但这不是我的问题。我在ManagedDataSource的类定义上遇到编译器错误:

  

类型'ManagedDataSource'不符合协议'UITableViewDataSource'

我不明白为什么编译器会给我一个错误,因为我的类实现了UITableViewDataSource所需的方法。问题似乎与仿制药有关。一旦我删除了泛型并使用AnyObject,错误就会消失,我的代码编译得很好。这不是我想要的,因为这样的类不是类型安全的。

1 个答案:

答案 0 :(得分:0)

现在可以使用Swift 2.0,无需任何解决方法。