#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. Ах, я боялся, что это может быть так. Спасибо за подтверждение.