косвенно установить связанный тип - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь выяснить, как неявно установить Generic (тип аргумента) в классе, не меняя тип всего класса на что-то вроде SomeTestClass , где владелец объекта должен знатьтип универсального.

Пример

Этот пример НЕ РАБОТАЕТ!Вот как я хотел бы, чтобы это работало

protocol SomeTestProtocol {
    associatedtype T

    init(arg: T)
}

Не хочу использовать SomeTestClass , потому что класс, который содержит этот класс, не будет знать тип используемых обобщений

class SomeTestClass: SomeTestProtocol {
    required init(arg: T) {
    }

    // Use T outside the init-scope
}

Примечание. Протокол - всего лишь попытка обходного пути!Для окончательного решения нет необходимости

Итак главный вопрос : как я могу использовать T вне области действия init в классе ниже без использования универсального класса, который долженбыть известным при владении объектом

class SomeTestClass2/*< T>*/ {
    init(arg: T) {
    }

    // Use T outside the init-scope
}

Спасибо за помощь!

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

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

Если вы хотите иметь универсальные методы в ваших соответствующих классах, вам понадобитсясделать сами классы родовыми.

0 голосов
/ 05 декабря 2018

Если вам нужен только доступ к T вне init, тогда вы просто сохраняете T в свойстве:

class S {
    let theType: Any.Type
    init<T>(arg: T) {
        theType = T.self
    }
}

Я подозреваю, что вы действительно хотите что-то отличное от того, что высказал, что хочешь.Я подозреваю, что вы хотите хранить arg.Но если это так, что вы планируете делать с arg, если вы не знаете, каков его тип?Какие методы вы можете назвать?Какой функцией может быть возвращаемое значение?Не прибегая к as?, вы ничего не можете сделать с T (а зависимость от as? обычно означает, что вы неправильно поняли ваши типы).

Так что вам нужно начать с того, что вы хотите T и SomeTestClass для использования.Без этого невозможно обсудить, как следует хранить T (хранилище не имеет значения, если вы его никогда не используете).

0 голосов
/ 05 декабря 2018

Важное замечание: T от associatedtype T и T от init<T> могут быть разных типов.Они оба определяют универсальный тип с разными областями действия и могут быть разными.Если вы хотите, чтобы они были одинаковыми, инициализация должна быть

init(arg: T)

Если SomeTestClass всегда будет использовать один и тот же тип, вы можете добавить

typealias T = Int // or something

или используйте init как

required init(arg: Int)

. Это работает, если вы избавляетесь от associatedtype T из протокола.Хотя это удаляет SomeTestClass.T существование формы.

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