Итак, я играл с расширениями протокола и столкнулся с «интересной» проблемой.
Я хотел написать тип единиц Meters
и Kilometers
для проверки некоторых вещей. ОЧЕНЬ легко сделать это как класс, в котором есть базовый класс, и оба подкласса переопределяют базу, просто переопределяя простое значение.
//Conversion factor between types
enum DISTANCE_UNIT_TYPE : Double {
case METER = 1.0;
case KILOMETER = 0.001;
}
protocol DistanceUnit {
var unitType : DISTANCE_UNIT_TYPE {get}
var value : Double { get set }
var baseValue : Double { get set }
}
struct Kilometers : DistanceUnit {
var unitType = DISTANCE_UNIT_TYPE.KILOMETER
var value : Double
var baseValue : Double
init(_ v : Double) {
value = v
baseValue = v * unitType.rawValue
}
}
struct Meters : DistanceUnit {
var unitType = DISTANCE_UNIT_TYPE.METER
var value : Double
var baseValue : Double
init(_ v : Double) {
value = v
baseValue = v * unitType.rawValue
}
}
Итак, как вы можете видеть, у меня много повторяющегося кода (в частности, инициализаторы)
Я попытался сделать расширение протокола, чтобы установить инициализатор по умолчанию.
extension DistanceUnit {
init(_ v : Double) {
value = v
baseValue = v * unitType.rawValue
}
}
но я получаю сообщение об ошибке переменная 'self' передается по ссылке перед инициализацией
Есть ли способ заставить это работать или мне просто нужно ввести много повторяющегося кода? Может быть, используя unsafe
или что-то в этом роде?