быстро, как определить связанный тип в подпротоколе - PullRequest
0 голосов
/ 27 мая 2020

У меня вопрос о типе, связанном с протоколом.

Вот код ..

protocol TestProtocol {
    associatedtype T: Equatable
}

struct Test {
    let value: TestProtocol
}

Ошибка.

struct Test<T: TestProtocol> {
    let value: T
}

И это нормально. но я не хочу использовать generi c в struct.

, поэтому я попробовал ..

protocol IntTestProtocol: TestProtocol where T == Int  {

}

struct Test {
    let value: IntTestProtocol
}

Но этот код также содержит ошибку.

как можно я определяю связанный тип TestProtocol в подпротоколе? это возможно?

1 Ответ

0 голосов
/ 27 мая 2020

Как насчет

protocol TestProtocol {
    associatedtype T: Equatable
}

struct TestProtocolContainer<U: Equatable>: TestProtocol {
    typealias T = U
}


struct Test {
    let value: TestProtocolContainer<Int>
}

Когда вы объявляете протокол с associatedtype (который предлагает статический c полиморфизм, если вы заинтересованы в понимании различных типов полиморфизма и как его достичь с помощью протокола в swift, прочтите мой блог здесь).

вы не можете использовать этот протокол как конкретный тип, потому что компилятор не может разрешить тип T во время компиляции. (Почему во время компиляции я сказал, что его статический c полиморфизм помните :))

Вот почему компилятор ожидает, что вы предоставите его каким-то образом, чтобы помочь ему разрешить тип associatedtype во время компиляции. Один из способов - предоставить typealias и указать фактический тип данных associatedtype.

пример:

struct TestProtocolContainer: TestProtocol {
    typealias T = Int
}

Это отлично работает, но тогда вы захотите сделать этот Generi c структура для представления любой структуры с типом Equatable. Вот где на помощь приходят Generics.

struct TestProtocolContainer<U: Equatable>: TestProtocol {

Это представляет структуру Generi c, которая использует любой тип Equatable и подтверждает TestProtocol и, наконец, устанавливает

typealias T = U

Обеспечивает подтверждение на TestProtocol

Надеюсь, это поможет

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