Различение между унаследованными связанными типами в протоколах Swift - PullRequest
3 голосов
/ 08 апреля 2019

Я работаю с библиотекой, которая определяет два протокола A и B, каждый со своим associatedtype T, например:

protocol A {
    associatedtype T
}
protocol B {
    associatedtype T
}

Два протокола не связаны на T, и поэтому теоретически третий протокол может наследоваться от A и B, typealias каждого T, для другого типа. К сожалению, я не могу заставить Свифта провести различие между двумя T с. Я пробовал что-то вроде:

protocol C: A, B {
    typealias A.T = String
    typealias B.T = String
}

но это не поддерживаемый синтаксис. Есть ли способ обойти это?

1 Ответ

3 голосов
/ 08 апреля 2019

Это обсуждалось в Множество протоколов, связанных с именами коллизий на форуме Swift. Сяоди Ву пишет:

Это очень возможно, но ассоциированные типы с одинаковыми именами должны в соответствующем типе выполняться одним и тем же типом.

В будущем может быть добавлен синтаксис, позволяющий типам соответствовать двум протоколам с такими требованиями к коллизии, но это добавляет большую сложность с точки зрения реализации и не обходится без собственных подводных камней для пользователей (например, он может получить очень запутанно для конечных пользователей вашего типа).

Таким образом, тип может соответствовать как A, так и B с идентичным ассоциированным типом T, например,

struct Foo: A, B {
    typealias T = String
}

и протокол может наследоваться от A и B и ограничивать T идентичным типом:

protocol C: A, B where T == String {

}

Соответствие обоим протоколам с различными ассоциированными типами в настоящее время не поддерживается.

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