创建通用函数以从 table 和集合视图获取索引路径 - iOS - Swift

Create generic function to get indexpath from table and collection view - iOS - Swift

我有一个 tableView 和 collectionView,为了获取 indexPath,我在 tableViewCell 和 collectionViewCell 上使用了以下方法(我不想使用 indexPathForSelectedRow/Item 方法)。有什么方法可以使它通用吗?

请出出主意

// For Tableview 
    func getIndexPath() -> IndexPath? {
        guard let superView = self.superview as? UITableView else {
            return nil
        }
        let indexPath = superView.indexPath(for: self)
        return indexPath
    }

// For CollectionView
     func getIndexPath() -> IndexPath? {
        guard let superView = self.superview as? UICollectionView else {
            return nil
        }
        let indexPath = superView.indexPath(for: self)
        return indexPath
    }

您可以使用两种协议来做到这一点,一种是 UITableViewUICollectionView 都遵守的,另一种是 UITableViewCellUICollectionViewCell 都遵守的。

protocol IndexPathQueryable: UIView {
    associatedtype CellType
    func indexPath(for cell: CellType) -> IndexPath?
}

protocol IndexPathGettable: UIView {
    associatedtype ParentViewType: IndexPathQueryable
}

extension UITableView : IndexPathQueryable { }
extension UICollectionView : IndexPathQueryable { }

extension UICollectionViewCell : IndexPathGettable {
    typealias ParentViewType = UICollectionView
}
extension UITableViewCell : IndexPathGettable {
    typealias ParentViewType = UITableView
}

extension IndexPathGettable where ParentViewType.CellType == Self {
    func getIndexPath() -> IndexPath? {
        guard let superView = self.superview as? ParentViewType else {
            return nil
        }
        let indexPath = superView.indexPath(for: self)
        return indexPath
    }
}

但实际上,您不应该 在 table 视图单元格上需要 getIndexPath 方法。单元格不应知道它们的索引路径。我建议你重新考虑你的设计。