【问题标题】:Subclassing Swift Double / Operator Overloading typealias子类化 Swift Double / 运算符重载类型别名
【发布时间】:2017-12-10 22:41:19
【问题描述】:

我希望能够在我的 swift 代码中使用一些自定义类型对 Double 进行子类化,以便稍后进行一些自省和运算符重载。

这在语义上是我希望能够写的:

class Frequency: Double {}

class Period: Double {
    init(_ frequency: Frequency) {
        let period: Double = 1 / frequency
        self.init(period)
    }
}


let a = Double(1)
print(type(of: a))  // Double

let b = Frequency(2)
print(type(of: b))  // Frequency

let c = Period(a)
print(type(of: c))  // Period == 1

let d = Period(b)
print(type(of: d))  // Period == 0.5

感觉我想做的事情应该是可行的,因为 Swift 是一种严格类型的语言。

我也看过类型别名,但你不能用这些来重载运算符。还查看了 FloatingPoint 协议,但似乎对我没有帮助。

【问题讨论】:

  • Double 是一个结构体,不能扩展。
  • @rmaddy 不幸的是没有。我想知道是否有不同的方法。也许是协议?

标签: swift types operator-overloading subclassing


【解决方案1】:

虽然这是不可能的,但我不久前创建了一个类,它解决了一个类似的问题。我需要一个多价变量类,以方便货币字符串中的合成,并最终得到类似下面的东西。到目前为止,它运行良好,我一直将它用作我从那时起构建的许多高级子类的砂浆。它做你想做的事,如果你可以在频率子类中看到,它变成了为每个用例调整 init 覆盖的问题。 虽然类很大,方法也很庞大,但您可以随意调整和修改您认为合适的方法,或者如果您找到更简单的方法。我在这里将它上传到一个 gist 文件中,以便于阅读。

Link to the class.

当与您的用例一起使用时,它允许以下内容,这似乎是您想要的:

class Frequency : MultiVar {
    override init(_ value: Any?) {
        super.init(value)
        let current = double
        guard current != 0.0 else {
            print("Frequency Error: Something went wrong while subclassing \(self), established variable 'double' is equal to 0!")
            return
        }
        double = 1 / current
    }
}

let freq = Frequency(10)
print(freq.string) //prints 0.1
print(freq.double) //prints 0.1

【讨论】:

    猜你喜欢
    • 2013-01-03
    • 1970-01-01
    • 2019-01-06
    • 2021-07-10
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多