所以我在玩协议扩展时遇到了一个“有趣”的问题。
我想写一个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
或什么?