我正在尝试扩展一个度量,以返回其自身的倒数。下面的代码不起作用,因为它实际上只扩展了一个UnitAngle,然后不能在测量上调用它:
导入基础
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,但我返回了我开始使用的同一个单元,方向正好相反。目前,我将在每个结构中需要它的地方使其成为一个函数,但这似乎是重复的,类型的扩展将解决我的问题并创建一个简单的。符号调用。谢谢。
发布于 2020-03-08 06:43:31
您可以定义一个被约束为UnitType为UnitAngle的Measurement扩展
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)
}
}示例:
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稍微简单一点的实现是
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)
}
}发布于 2020-03-08 06:42:37
您可以扩展Measurement并将UnitType约束为UnitAngle
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)
}
}https://stackoverflow.com/questions/60582798
复制相似问题