Как создать универсальный UITableviewCell, у которого есть способ передать универсальный тип данных в основной UIViewController через делегатов или каким-либо другим способом? - PullRequest
1 голос
/ 12 марта 2019

Я пытаюсь создать универсальный UITableViewcell, который может выводить универсальный тип на конкретный тип при создании ячейки, как показано ниже:

    protocol ConfigureCell {
        associatedtype DataType
        func configure(data:DataType)
    }

            class AbstractCell<T:Codable>: UITableViewCell , ConfigureCell  {

            func configure(data: T) {

            }

            var delegate : AbstractCellDelegate!
        }


class UserCell:AbstractCell<UserDetail> {

    override func configure(data: UserDetail) {

    }
}

    protocol AbstractCellDelegate {
     associatedtype DataType
    func cellBtnClicked(model:DataType,index:Int,cell:AbstractCell<DataType>)
    func cellBtnClicked(model:DataType,index:Int,cell:AbstractCell<DataType>,action:String)
    func cellBtnClicked(model:DataType?,index:Int,cell:AbstractCell<DataType>,action:String)
}

enter image description here

enter image description here

У меня также есть несколько делегатов, которые могут использоваться для передачи связанных данных в основной UIViewController, если это необходимо.Делегаты работают нормально, если ячейка не является общей, но после создания общей ячейки я не могу использовать методы делегата со следующей ошибкой.Это может быть решено с помощью стирания типа, но это будет излишним для этого, так как я не очень понимаю их.Есть ли способ, которым я могу создать общую ячейку, а также способ вызова метода в основной класс UIViewcontroller через делегатов или любым другим способом.

1 Ответ

0 голосов
/ 12 марта 2019

Попробуйте, Кредиты Шаблоны проектирования связанных типов Swift

protocol ConfigureCell {
    associatedtype DataType
    func configure(data: DataType)
}

class AbstractCell<T: Codable>: UITableViewCell, ConfigureCell {
    func configure(data: T) {
    }

    var delegate: AbstractCellDelegate?
}

class UserCell: AbstractCell<UserDetail> {
    override func configure(data: UserDetail) {
    }
}

protocol AbstractCellDelegate {
    func cellBtnClicked(model: Codable, index: Int, cell: Any)
    func cellBtnClicked(model: Codable, index: Int, cell: Any, action: String)
    func cellBtnClicked(model: Codable?, index: Int, cell: Any, action: String)
}

extension AbstractCellDelegate {
    // dont need them
    func cellBtnClicked(model: Codable, index: Int, cell: Any) {}
    func cellBtnClicked(model: Codable, index: Int, cell: Any, action: String) {}
    func cellBtnClicked(model: Codable?, index: Int, cell: Any, action: String) {}
}

protocol CellDelegate: AbstractCellDelegate {
    associatedtype DataType: Codable
    func cellBtnClicked(model: DataType, index: Int, cell: AbstractCell<DataType>)
    func cellBtnClicked(model: DataType, index: Int, cell: AbstractCell<DataType>, action: String)
    func cellBtnClicked(model: DataType?, index: Int, cell: AbstractCell<DataType>, action: String)
}

struct UserDetail: Codable {
}

struct MyDataType: Codable {
}

class MyViewController: CellDelegate {
    func cellBtnClicked(model: MyDataType, index: Int, cell: AbstractCell<MyDataType>) {
    }

    func cellBtnClicked(model: MyDataType, index: Int, cell: AbstractCell<MyDataType>, action: String) {
    }

    func cellBtnClicked(model: MyDataType?, index: Int, cell: AbstractCell<MyDataType>, action: String) {
    }

    typealias DataType = MyDataType
}

...