Несколько типов в функции - PullRequest
0 голосов
/ 21 апреля 2020

Я хочу передать тип T в функцию (например, он содержит RatingCell), но я не понимаю, как сделать тип T определенным точно как RatingCell

func configureQuestionCell<T>(cellType: T, question: Question, answers: [String]?) -> UITableViewCell {

        let cell = self.blockContent.dequeueReusableCell(withIdentifier: ReusableCellID.pickerCell.rawValue) as! T
        //Value of type 'T' has no member ... 
        cell.delegate = self 
        cell.questionId = question.questionId
        cell.cellTitle.text = question.title
        cell.answerVariants = question.answerVariants 
        if answers != nil { 
            cell.userAnswers = answers!
        }
        return cell
    }

Я добавляю ошибку в комментарий. Я также уверен, что RatingCell содержит все эти параметры

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Возможное решение - добавить протокол

protocol Reusable {
    var delegate : ReusableDelegate { get set } // change the type to the real delegate type
}

и ограничить тип generic c протоколом. Вы должны ограничить тип generi c UITableViewCell в любом случае

func configureQuestionCell<T>(cellType: T) where T : UITableViewCell & Reusable {
    let cell = self.blockContent.dequeueReusableCell(withIdentifier: ReusableCellID.ratingCell.rawValue) as! T
    cell.delegate = self
}

Для нескольких различных типов делегатов используйте связанный тип

protocol Reusable {
    associatedtype DelegateType
    var delegate : DelegateType { get set } 
}

. В ячейке выберите протокол и добавьте

typealias DelegateType = < The actual delegate type of the cell >
0 голосов
/ 21 апреля 2020

Я не профессионал в Swift, но вы пытались передать интерфейс в качестве параметра и поэтому все буквы "T" должны иметь .delegate, например, Like, чтобы он работал

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...