swift - 有效地包裹双

标签 swift swift3 double

我有许多几何函数只接受 0° 到 360° 范围内的角度。如果角度超出该范围,则该角度无效(即不能将 365° 转换为 5°),调用函数也没有意义。为此,我创建了以下类:

struct PositiveAngle {
    public let value: Double

    init?(value: Double) {
        guard 0.0 <= value && value <= 360.0 else {
            return nil
        }
        self.value = value
    }
}

按如下方式使用:

let angle = PositiveAngle(value: 30.0)
print(angle.value)

func foo(angle: PositiveAngle) -> PositiveAngle {
    ...
}

这行得通,但感觉“笨拙”,因为每当我需要使用它时,我都会从结构中提取角度值。鉴于我所追求的只是一个范围受限的 Double,是否有更有效的方法来实现这一目标?

最佳答案

如果您不想在每个函数中访问.value,您将不得不自己添加辅助函数。

例如定义sin:

func sin(_ angle: PositiveAngle) -> Double {
    return sin(angle.value * Double.pi / 180)
}

现在您可以直接将 PositiveAngle 作为参数调用 sin

您可以对运算符执行相同的操作,例如+, -

关于swift - 有效地包裹双,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43154612/

相关文章:

ios - Swift UIlabels 在 uistackview 中显示不正确

java - 我可以用什么大 double 来模拟无穷大?

java - 将 double 转换为 byte[] 数组

c - 如何获得 10 次方的 double 的尾数和指数?

swift - 更改对象的框架大小后更新自动布局

arrays - Swift 数组中的 CGFloat

ios - cellForRow(在 : IndexPath) in swift 3 is acting funny in XCode 8

swift - 使用 Swift 而不是 Objective-C 从解析数据中保存对象

ios - 为什么 NSFetchRequest 没有初始化?

ios - swift 3 WKWebView 'URLRequest';您的意思是使用 'as' 进行显式转换吗? ( 漏洞 )