Расширение типа, чтобы иметь несколько значений для одного и того же связанного типаIOS

Программируем под IOS
Ответить
Anonymous
 Расширение типа, чтобы иметь несколько значений для одного и того же связанного типа

Сообщение Anonymous »

Придумать точное название было немного сложно, поэтому я продемонстрирую свою проблему с простым примером. Я хочу создать протокол, который указывает, что адгеритор может быть преобразован в другой тип: < /p>

Код: Выделить всё

protocol Transformable {
associatedtype TransformableTo
func transform() -> TransformableTo
}
< /code>
Затем создайте конкретные протоколы для каждого типа: < /p>
protocol DoubleTransformable: Transformable where TransformableTo == Double {}
< /code>
Так что, например, я хочу, чтобы строки могли преобразовать в удвоение, я бы написал: < /p>
extension String: DoubleTransformable {
func transform() -> Double {
return Double(self)
}
}
< /code>
Это отлично работает, пока я не хочу, чтобы определенный тип соответствовал большему, чем эти «конкретные» преобразуемые контракты: < /p>
protocol DecimalTransformable: Transformable where TransformableTo == Decimal {}
extension String: DecimalTransformable {
func transform() -> Decimal {
...
}
}
Компилятор лает на меня в расширении строки выше, так как тип TransformableTo для DecimalTransformable сталкивается с типом TransformableTo для doubleTransformable . Это имеет смысл для меня, но я не вижу обходного пути. Любые советы о том, как решить это и/или другое направление, которое выполняет одно и то же, будет оценен. Это упрощенная версия фактического кода, так что это может показаться немного странным, но я думаю, что она доставляет точку зрения. Я не хочу подвергать данные в приватемодели клиентам, чтобы PublicModel действовала как посредник между Privatemodel и клиентом. Проблема, которую я пытаюсь решить, заключается в том, что иногда тип свойства Privatemodel отличается от того, что я хочу, чтобы соответствующее свойство PublicModel было (и изменение типа приватемодели не является стартовым). < /P>

Код: Выделить всё

struct PrivateModel {
var date: String { return "Jan. 1, 1970" }
}
< /code>
struct PublicModel {
private let privateModel: PrivateModel

init(source: PrivateModel) {
self.privateModel = source
}

var date: Date {
return self.privateModel.date.transform()
}
}
< /code>
Note the call to transform
в общедоступной модели. Моя фактическая цель здесь состоит в том, чтобы иметь единый метод преобразования, который я могу вызвать на любой объект типа, где общий тип возврата преобразования выводится по типу собственности, чьи геттер я внутри.

Подробнее здесь: https://stackoverflow.com/questions/659 ... ciatedtype
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»