我正在尝试将此Obj-C
代码转换为Swift
代码,但我不知道该代码的等效内容应该是什么?
#define DEGREES_TO_RADIANS(degrees)((M_PI * degrees)/180)
我用Google搜索并找到this
但在我的情况下,我不明白如何在Swift中转换它?
答案 0 :(得分:234)
Xcode 10•Swift 4.2或更高版本
extension BinaryInteger {
var degreesToRadians: CGFloat { return CGFloat(self) * .pi / 180 }
}
extension FloatingPoint {
var degreesToRadians: Self { return self * .pi / 180 }
var radiansToDegrees: Self { return self * 180 / .pi }
}
<强>游乐场强>
45.degreesToRadians // 0.785398163397448
Int(45).degreesToRadians // 0.785398163397448
Int8(45).degreesToRadians // 0.785398163397448
Int16(45).degreesToRadians // 0.785398163397448
Int32(45).degreesToRadians // 0.785398163397448
Int64(45).degreesToRadians // 0.785398163397448
UInt(45).degreesToRadians // 0.785398163397448
UInt8(45).degreesToRadians // 0.785398163397448
UInt16(45).degreesToRadians // 0.785398163397448
UInt32(45).degreesToRadians // 0.785398163397448
UInt64(45).degreesToRadians // 0.785398163397448
Double(45).degreesToRadians // 0.7853981633974483
CGFloat(45).degreesToRadians // 0.785398163397448
Float(45).degreesToRadians // 0.7853981
Float80(45).degreesToRadians // 0.785398163397448278999
答案 1 :(得分:50)
这与您的要求不同,但在Swift 3 / iOS 10中,您可以使用Measurement类型并在不知道公式的情况下进行转换!
let result = Measurement(value: 45, unit: UnitAngle.degrees)
.converted(to: .radians).value
答案 2 :(得分:41)
Apple为转换提供了这些GLKit functions:
func GLKMathDegreesToRadians(_ degrees: Float) -> Float
func GLKMathRadiansToDegrees(_ radians: Float) -> Float
答案 3 :(得分:16)
let angle = 45° // angle will be in radians, 45 is in degrees
在 Swift 3 下编译。仍保留所有值,使用CGFloats以弧度进行所有计算...,但使用常量度数使代码更具可读性。 例如:90° °符号会神奇地将度数转换为弧度转换。
如何设置:
为°符号定义并使用后缀运算符。此运算符将执行从度到弧度的转换。 这个例子适用于Ints,如果你有需要,也可以为Float类型扩展它们。
postfix operator °
protocol IntegerInitializable: ExpressibleByIntegerLiteral {
init (_: Int)
}
extension Int: IntegerInitializable {
postfix public static func °(lhs: Int) -> CGFloat {
return CGFloat(lhs) * .pi / 180
}
}
一些使用示例:
let angle = 45°
contentView.transform = CGAffineTransform(rotationAngle: 45°)
let angle = 45
contentView.transform = CGAffineTransform(rotationAngle: angle°)
警告!
使用此转换太容易两次(错误地在弧度值上),结果会得到一个非常小的数字,看起来结果角度总是为零......不要使用°两次相同的值(不要转换两次)!!:
// OBVIOUSLY WRONG!
let angle = 45°° // ° used twice here
// WRONG! BUT EASY TO MISS
let angle = 45° // ° used here
contentView.transform = CGAffineTransform(rotationAngle: angle°) // ° also used here
答案 4 :(得分:11)
此外,将fron弧度转换为度数(如果有人在谷歌上发现这一点):
var degrees = radians * (180.0 / M_PI)
答案 5 :(得分:2)
创建变量名时不再局限于ASCII字符,那么使用π(alt-p)如何:
typealias RadianAngle = CGFloat
let π = RadianAngle(M_PI)
let π_x_2 = RadianAngle(M_PI * 2)
let π_2 = RadianAngle(M_PI_2)
let π_4 = RadianAngle(M_PI_4)
extension RadianAngle {
var degrees: CGFloat {
return self * 180 / π
}
init(degrees: Int) {
self = CGFloat(degrees) * π / 180
}
}
使用示例:
let quarterCircle = RadianAngle(degrees: 90)
print("quarter circle = \(quarterCircle) radians")
// quarter circle = 1.5707963267949 radians
let halfCircle = π
print("half circle = \(halfCircle.degrees) degrees")
// half circle = 180.0 degrees
答案 6 :(得分:1)
我使用与上面提到的相同的原则@ t1ser,但创建extension CGFloat {
func degrees() -> CGFloat {
return self * .pi / 180
}
init(degrees: CGFloat) {
self = degrees.degrees()
}
}
的扩展名,以便更容易使用小数位数(例如,你可以有23.4度):
option+shift+8
使用它也很容易(主要是因为我个人不知道如何键入° - 如果你没有,也就是let degreesToConvert: CGFloat = 45.7
.
.
.
let convertedDegrees = degreesToConvert.degrees()
btw):
let convertedDegrees = CGFloat(degrees: 45.3)
或者使用初始化程序:
meal_period
答案 7 :(得分:1)
Swift 4.2
您可以编写全局通用函数:
public func radians<T: FloatingPoint>(degrees: T) -> T {
return .pi * degrees / 180
}
public func degrees<T: FloatingPoint>(radians: T) -> T {
return radians * 180 / .pi
}
示例:
let cgFloat: CGFloat = 23.0
let double: Double = 23.0
let float: Float = 23.0
let int: Int = 23
let cgf = radians(degrees: cgFloat) // 0.4014 CGFloat
let d = radians(degrees: double) // 0.4014 Double
let f = radians(degrees: float) // 0.4014 Float
let i = radians(degrees: int) // compile error
如果您不想扩展所有这样的浮动类型
extension FloatingPoint { ... }
答案 8 :(得分:0)
在度数和弧度之间转换 Double 的最有效和最准确的方法:
import Foundation
extension Double {
var radians: Double { return Measurement(value: self, unit: UnitAngle.degrees).converted(to: UnitAngle.radians).value }
var degrees: Double { return Measurement(value: self, unit: UnitAngle.radians).converted(to: UnitAngle.degrees).value }
}
Apple 的 Foundation 团队很久以前就通过开发超越所有其他解决方案的解决方案解决了这个问题:
答案 9 :(得分:-3)
swift 2.3
trainDataVecs