gpt4 book ai didi

swift - Swift 初始化的三元运算符

转载 作者:行者123 更新时间:2023-11-28 07:07:20 24 4
gpt4 key购买 nike

来自 How to customize ternary operators in Swift我知道可以使用两个二元运算符创建自定义三元运算符,我的问题是:

有什么方法可以用它来初始化类或结构?

假设我有一个LinearEquation。一切正常,但初始化实例感觉不太自然。目前它是这样工作的:

struct LinearEquation {
var m: Double
var c: Double

func of(x: Double) -> Double {
return m * x + c
}
}

let f = LinearEquation(m: 2, c: 1)
f.of(2) // returns 5

有没有一种方法可以通过编写 let f = m * x + c 来创建 LinearEquation?如果直线经过原点,是否也可以省略 + c

(我已经在下面给出了答案,但我想知道是否有人对我答案末尾所述的原因有任何其他建议)

最佳答案

我会选择稍微不同的方法。有了您的解决方案,您得到意想不到的结果:

let f1 = x * 2 + (1 + 2)
println(f1.of(1)) // 5.0 (correct)

let f2 = x * 2 + 1 + 2
println(f2.of(1)) // 4.0 (What ??)

let f3 = { println("foo") } * 2

编译没有意义。

我会将线性函数“x”定义为静态成员(和 mc 作为常量 属性):

struct LinearEquation {
let m: Double
let c: Double

func of(x: Double) -> Double {
return m * x + c
}

static let X = LinearEquation(m: 1.0, c: 0.0)
}

加法和乘法

func * (lhs: LinearEquation, rhs: Double) -> LinearEquation {
return LinearEquation(m: lhs.m * rhs, c: lhs.c * rhs)
}

func + (lhs: LinearEquation, rhs: Double) -> LinearEquation {
return LinearEquation(m: lhs.m, c: lhs.c + rhs)
}

然后

let f1 = LinearEquation.X * 2 + 1 + 2
println(f1.of(1)) // 5.0

按预期工作。并与

extension LinearEquation : FloatLiteralConvertible {
init(floatLiteral value: Double) {
self = LinearEquation(m: 0.0, c: value)
}
}

你可以简单地定义一个常量函数

let f2 : LinearEquation = 2.0
println(f2.of(3)) // 2.0

关于swift - Swift 初始化的三元运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29987934/

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