Общий протокол со связанным типом, не определяющим неявно - PullRequest
0 голосов
/ 30 августа 2018

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

'RowProtocol' неоднозначен для поиска типов в этом контексте

protocol RowProtocol {
    associatedtype T
    var cellClass: T.Type { get }
    init(cellClass: T.Type)
}

struct Row: RowProtocol {
    let cellClass: T.Type
    init(cellClass: T.Type) {
        self.cellClass = cellClass
    }
}

Затем вы можете инициализировать его, используя:

let implicitRow = Row(cellClass: Cell.self)

Как я могу сделать эту работу?

1 Ответ

0 голосов
/ 30 августа 2018

Соответствие RowProtocol требует сопоставления связанного типа T с конкретным типом, а Row этого не делает. Я предполагаю, что вы также хотите сделать Row универсальным, поэтому вы не указали псевдоним типа для T из протокола.

Решение состоит в том, чтобы сделать Row также общим:

struct Row<T>: RowProtocol {
    let cellClass: T.Type
    init(cellClass: T.Type) {
        self.cellClass = cellClass
    }
}

Теперь компилятор доволен, поскольку у него есть конкретный тип для передачи RowProtocol. Имейте в виду, что для компилятора T из Row отличается от T из RowProtocol, причем последний является требованием протокола, а первый - универсальным.

// exactly the same struct, but with different name for the generic argument.
struct Row<U>: RowProtocol {
    let cellClass: U.Type
    init(cellClass: U.Type) {
        self.cellClass = cellClass
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...