swift2中协议扩展和默认值的限制

swift2中协议扩展和默认值的限制,swift,protocols,swift-protocols,Swift,Protocols,Swift Protocols,所以我在玩协议扩展时遇到了一个“有趣”的问题 我想写一个米和公里单位类型来测试一些东西。当一个类有一个基类并且两个子类都重写基类,而只重写一个简单的值时,就很容易做到这一点 //Conversion factor between types enum DISTANCE_UNIT_TYPE : Double { case METER = 1.0; case KILOMETER = 0.001; } protocol DistanceUnit { var unitTyp

所以我在玩协议扩展时遇到了一个“有趣”的问题

我想写一个
公里
单位类型来测试一些东西。当一个类有一个基类并且两个子类都重写基类,而只重写一个简单的值时,就很容易做到这一点

//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”的错误


有没有办法让它工作或者我只需要输入大量重复的代码?可能使用不安全的
或其他什么?

我认为
fqdn
是正确的,我们不能像我们希望的那样在协议扩展中使用自定义inits,但只有时间会告诉我们

但仍有一些解决办法:

struct Meters : DistanceUnit {

    var unitType = DISTANCE_UNIT_TYPE.METER
    var value : Double
    var baseValue : Double

    init() { // this one is needed as designated initializer for your protocol extension
        value = 0
        baseValue = 0
    }
}

protocol DistanceUnit {

    var unitType : DISTANCE_UNIT_TYPE {get}
    var value : Double { get set }
    var baseValue : Double { get set }
    init() // this is new and you will NEED to implement this in your structure or class
}

extension DistanceUnit {

    init(_ v : Double) {
       self.init()
       value = v
       baseValue = v * unitType.rawValue
    }

    // you can now implement a lot more different default inits and they should work fine here :)
    // here is a quick example

    init(_ s : String) {
       self.init(Double(s.characters.count))
    }
}

希望这对你有帮助。几天前,我在构建带有协议扩展()的自定义通用单例生成器时学会了这个技巧。

这可能会达到。。。但我认为,我们可以在下面找到这样做的理由->“[p]rotocols可以扩展以提供符合类型的方法和属性实现”-然而,初始化器不是“方法”,编程语言指南告诉我们,“初始化器…类似于特殊方法”->因此,也许我们可以从中得出这样的结论:我们不能为使用协议扩展的初始值设定者提供默认实现?