Home » Ios » How can I convert from degrees to radians?

# How can I convert from degrees to radians?

Questions:

I am trying to convert this `Obj-C` code to `Swift` code but I don’t know what the equivalent of this code should be ?

``````#define DEGREES_TO_RADIANS(degrees)((M_PI * degrees)/180)
``````

But I don’t understand how to convert that in Swift in my case?

Xcode 9 • Swift 4

``````extension BinaryInteger {
var degreesToRadians: CGFloat { return CGFloat(Int(self)) * .pi / 180 }
}

extension FloatingPoint {
var degreesToRadians: Self { return self * .pi / 180 }
var radiansToDegrees: Self { return self * 180 / .pi }
}
``````

Playground

``````45.degreesToRadians         // 0.785398163397448

``````

Questions:

Apple provides these GLKit functions for conversion:

``````func GLKMathDegreesToRadians(_ degrees: Float) -> Float
``````

Questions:

This is not identically what you asked, but in Swift 3 / iOS 10, you can use the Measurement type and do the conversion without knowing the formula!

``````let result = Measurement(value: 45, unit: UnitAngle.degrees)
``````

Questions:
``````let angle = 45° // angle will be in radians, 45 is in degrees
``````

Compiles under Swift 3. Still keep all values, do all calculations in radians with CGFloats…, but make the code more readable with the constants in degrees. For example: 90°
The ° sign will magically do the degrees to radians conversion.

How to set this up:

Define and use a postfix operator for the ° sign. This operator will do the conversion from degrees to radians.
This example is for Ints, extend these also for the Float types if you have the need.

``````postfix operator °

protocol IntegerInitializable: ExpressibleByIntegerLiteral {
init (_: Int)
}

extension Int: IntegerInitializable {
postfix public static func °(lhs: Int) -> CGFloat {
return CGFloat(lhs) * .pi / 180
}
}
``````

Some examples of usage:

``````let angle = 45°

contentView.transform = CGAffineTransform(rotationAngle: 45°)

let angle = 45
contentView.transform = CGAffineTransform(rotationAngle: angle°)
``````

Warning!

It is too easy to use this conversion twice (on a value already in radians by mistake), you will get a very small number as the result, and seemingly the resulting angle will be always zero… DO NOT use ° on the same value twice (do not convert twice)!!:

``````// 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
``````

Questions:

Also, to convert fron radians to degrees (if anyone stumbles upon this on google):

``````var degrees = radians * (180.0 / M_PI)
``````

Questions:

You’re no longer limited to ASCII characters when creating variable names, so how about this using π (alt-p):

``````typealias RadianAngle = CGFloat

let π_x_2 = RadianAngle(M_PI * 2)

var degrees: CGFloat {
return self * 180 / π
}
init(degrees: Int) {
self = CGFloat(degrees) * π / 180
}
}
``````

Example usage:

``````let quarterCircle = RadianAngle(degrees: 90)
// quarter circle = 1.5707963267949 radians

let halfCircle = π
print("half circle = \(halfCircle.degrees) degrees")
// half circle = 180.0 degrees
``````

Questions:

I’d use the same principle @t1ser mentioned above, but create an extension of `CGFloat` to make it easier to use decimals for the degree as well (so you could have a 23.4 degrees, for example):

``````extension CGFloat {
func degrees() -> CGFloat {
return self * .pi / 180
}

init(degrees: CGFloat) {
self = degrees.degrees()
}
}
``````

Using it would be pretty easy as well (mainly because I personally didn’t know how to type ° ? – in case you didn’t either, it’s `option+shift+8` btw):

``````let degreesToConvert: CGFloat = 45.7
.
.
.
let convertedDegrees = degreesToConvert.degrees()
``````

Or to use the initialiser:

``````let convertedDegrees = CGFloat(degrees: 45.3)
``````