Доступ к свойствам и методам из swift generic

#ios #swift #generics #generic-programming

#iOS #swift #дженерики #generic-программирование

Вопрос:

Я не уверен, возможно ли это или нет, но я думаю, что видел это раньше.

Я выполняю некоторую проверку объектов формы во всем моем приложении, и мне нужен центральный, многократно используемый способ сделать это. Я пришел к следующему выводу:

 class RGOValidatedObject<T> {
    var validationPredicate: ((RGOValidatedObject<T>) -> Bool)?

    var isValid: Bool {
        return true
    }
}
 

Я хочу иметь возможность доступа к свойствам и методам T, как если бы я его подклассировал напрямую, а не добавлял свойство RGOValidatedObject , чтобы возвращать значение T. Рассмотрим следующее:

 RGOValidatedObject<String>().substringToIndex(1)
 

Это то, что я подразумеваю под доступом к свойствам и методам T на RGOValidatedObject , почти как если бы я только что подкласс T.

Возможно ли это? Если да, то как мне это сделать? Я новичок в концепции Swift generics, но мне нравится их внешний вид.

Комментарии:

1. Какого результата вы ожидаете от этой линии RGOValidatedObject<String>().substringToIndex(1) ?

2. Я бы ожидал исключения индекса массива вне диапазона, но дело не столько в этом. Это скорее вопрос того, распознает ли компилятор этот String метод из RGOValidatedObject ?

3. Похоже, вам нужно добавить свойство типа держателя значения T по порядку. Вы получите что-то очень похожее на Optional<T> структуру перечисления. Вероятно, знание того, как Optional тип реализует пересылку, может помочь вам в решении вашей проблемы. Вы можете попытаться исследовать его, копая исходный код swift

Ответ №1:

Нет, не существует синтаксиса «подъема», который перенаправлял бы методы таким образом (хотя было несколько дискуссий о подобных функциях в будущем). let value: T Для доступа к нему необходимо добавить свойство.

Несколько более распространенной версией этой проблемы является создание Observable<T> . Вы не можете сделать это полностью прозрачным в Swift, чтобы вы могли просто вызывать T для него методы (так, как вы можете с помощью KVO magic). Оно должно быть явным.

Комментарии:

1. Ах, я боялся, что это может быть так. Спасибо за подтверждение.