Быстрые протоколы с взаимно рекурсивными связанными типовыми ограничениями в функции - PullRequest
3 голосов
/ 23 октября 2019

Можно ли ограничить два родственных параметра, связанных типами в функции, друг с другом?

Я пытаюсь сделать что-то вроде этого:

protocol One {
    associatedtype first: Two
}

protocol Two {
    associatedtype second: One
}

func f<O: One, T: Two>(o: O) -> T where O.first == T, T.second == O {
    fatalError()
}

Сбой с ошибками:

'first' is not a member type of 'O'

'second' is not a member type of 'T'

1 Ответ

2 голосов
/ 23 октября 2019

Мне удалось получить этот компилятор, сняв одно из ограничений функции:

func f<O: One, T>(o: O) -> T where O.first == T, T.second == O {
    fatalError()
}

Вам не нужно говорить, что T соответствует Two, поскольку это уже подразумеваетсяO.first == T (потому что O.first должно соответствовать Two). Как только я вынул это, это скомпилировано.

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