gpt4 book ai didi

swift - 协议(protocol)扩展的限制和 swift2 中的默认值

转载 作者:搜寻专家 更新时间:2023-10-31 22:15:14 25 4
gpt4 key购买 nike

所以我在研究协议(protocol)扩展时遇到了一个“有趣”的问题。

我想写一个 MetersKilometers 单位类型来测试一些东西。作为一个有基类并且两个子类都覆盖基类的类,很容易做到这一点,同时只覆盖一个简单的值

//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
}
}

所以你可以看到我有很多重复的代码(特别是初始化程序)

我尝试做一个协议(protocol)扩展来设置默认初始化器

extension DistanceUnit {

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

但我得到一个错误:variable 'self' before being initialized passed by reference

有什么方法可以让它工作,还是我只需要输入很多重复的代码?也许使用 unsafe 之类的东西?

最佳答案

我假设 fqdn 是正确的,我们将无法像我们希望的那样在协议(protocol)扩展中使用自定义初始化,但只有时间会证明一切。

但还是有一些解决方法:

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))
}
}

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

关于swift - 协议(protocol)扩展的限制和 swift2 中的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31207908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com