首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展Measurement<UnitAngle>以提供互换角度

扩展Measurement<UnitAngle>以提供互换角度
EN

Stack Overflow用户
提问于 2020-03-08 06:28:47
回答 2查看 73关注 0票数 1

我正在尝试扩展一个度量,以返回其自身的倒数。下面的代码不起作用,因为它实际上只扩展了一个UnitAngle,然后不能在测量上调用它:

导入基础

代码语言:javascript
复制
extension UnitAngle {
    func reciprocal(_ angle: Measurement<UnitAngle>) -> Measurement<UnitAngle> {
        var recip = angle.converted(to: .degrees)
        if recip.value < 180 {
            recip.value = recip.value + 180
            return recip.converted(to: angle.unit)
        } else {
            recip.value = recip.value - 180
            return recip.converted(to: angle.unit)
        }
    }
}

我遇到的问题是,我不知道如何让它只应用于测量。我也考虑过让它成为自己的转换器,根据Custom measurement unit,但我返回了我开始使用的同一个单元,方向正好相反。目前,我将在每个结构中需要它的地方使其成为一个函数,但这似乎是重复的,类型的扩展将解决我的问题并创建一个简单的。符号调用。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-08 06:43:31

您可以定义一个被约束为UnitTypeUnitAngleMeasurement扩展

代码语言:javascript
复制
extension Measurement where UnitType == UnitAngle {
    func reciprocal() -> Measurement {
        var recip = self.converted(to: .degrees)
        if recip.value < 180 {
            recip.value = recip.value + 180
        } else {
            recip.value = recip.value - 180
        }
        return recip.converted(to: self.unit)
    }
}

示例:

代码语言:javascript
复制
let a = Measurement(value: 10, unit: UnitAngle.degrees)
print(a) // 10.0 °
print(a.reciprocal()) // 190.0 °

let b = Measurement(value: -.pi/2 , unit: UnitAngle.radians)
print(b) // -1.5707963267948966 rad
print(b.reciprocal()) // 1.5707952034743378 rad

稍微简单一点的实现是

代码语言:javascript
复制
extension Measurement where UnitType == UnitAngle {
    func reciprocal() -> Measurement {
        var recip = self.converted(to: .degrees)
        recip.value = (recip.value + 180).truncatingRemainder(dividingBy: 360)
        return recip.converted(to: self.unit)
    }
}
票数 0
EN

Stack Overflow用户

发布于 2020-03-08 06:42:37

您可以扩展Measurement并将UnitType约束为UnitAngle

代码语言:javascript
复制
extension Measurement where UnitType == UnitAngle {
    var straightAngle: Double {
        switch unit {
        case .degrees: return 180
        case .radians: return .pi
        default: fatalError()
        }
    }
    var reciprocal: Self {
        let straightAngle = self.straightAngle
        let value = (self.value + straightAngle).truncatingRemainder(dividingBy: straightAngle * 2)
        return .init(value: value, unit: unit)
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60582798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档