このObj-C
コードをSwift
コードに変換しようとしていますが、このコードに相当するものを知りませんか?
#define DEGREES_TO_RADIANS(degrees)((M_PI * degrees)/180)
しかし、私の場合、それをSwiftで変換する方法がわかりませんか?
このObj-C
コードをSwift
コードに変換しようとしていますが、このコードに相当するものを知りませんか?
#define DEGREES_TO_RADIANS(degrees)((M_PI * degrees)/180)
しかし、私の場合、それをSwiftで変換する方法がわかりませんか?
回答:
Xcode 11•Swift 5.1以降
extension BinaryInteger {
var degreesToRadians: CGFloat { CGFloat(self) * .pi / 180 }
}
extension FloatingPoint {
var degreesToRadians: Self { self * .pi / 180 }
var radiansToDegrees: Self { self * 180 / .pi }
}
遊び場
45.degreesToRadians // 0.7853981633974483
Int(45).degreesToRadians // 0.7853981633974483
Int8(45).degreesToRadians // 0.7853981633974483
Int16(45).degreesToRadians // 0.7853981633974483
Int32(45).degreesToRadians // 0.7853981633974483
Int64(45).degreesToRadians // 0.7853981633974483
UInt(45).degreesToRadians // 0.7853981633974483
UInt8(45).degreesToRadians // 0.7853981633974483
UInt16(45).degreesToRadians // 0.7853981633974483
UInt32(45).degreesToRadians // 0.7853981633974483
UInt64(45).degreesToRadians // 0.7853981633974483
Double(45).degreesToRadians // 0.7853981633974483
CGFloat(45).degreesToRadians // 0.7853981633974483
Float(45).degreesToRadians // 0.7853981
Float80(45).degreesToRadians // 0.78539816339744830963
常にCGFloatを返すのではなく、2進整数が浮動小数点型を返すようにしたい場合は、計算されたプロパティの代わりにジェネリックメソッドを作成できます。
extension BinaryInteger {
func degreesToRadians<F: FloatingPoint>() -> F { F(self) * .pi / 180 }
}
let radiansDouble: Double = 45.degreesToRadians() // 0.7853981633974483
let radiansCGFloat: CGFloat = 45.degreesToRadians() // 0.7853981633974483
let radiansFloat: Float = 45.degreesToRadians() // 0.7853981
let radiansFloat80: Float80 = 45.degreesToRadians() // 0.78539816339744830963
CGFloat
か?
これはあなたが尋ねたものと同じではありませんが、Swift 3 / iOS 10では、Measurementタイプを使用して、式を知らなくても変換を実行できます!
let result = Measurement(value: 45, unit: UnitAngle.degrees)
.converted(to: .radians).value
let angle = 45° // angle will be in radians, 45 is in degrees
Swift 3でコンパイルします。それでもすべての値を保持し、すべての計算をCGFloatsでラジアンで行いますが、定数を度数で読みやすくします。例:90 °°記号は、魔法のように度をラジアンに変換します。
これを設定する方法:
°記号に後置演算子を定義して使用します。この演算子は度からラジアンへの変換を行います。この例はInt用です。必要に応じて、これらを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°)
警告!
この変換を2回使用するのは簡単すぎます(既に誤ってラジアンの値になっている場合)。結果として非常に小さい数値が得られ、結果として得られる角度は常にゼロになるようです。同じ上では°を使用しないでください値を2回(2回変換しないでください)!!:
// 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
IntegerInitializable
プロトコルは無意味です。Intはすでに準拠ExpressibleByIntegerLiteral
public extension FixedWidthInteger { postfix static func °<T: FloatingPoint>(lhs: Self) -> T { T(lhs) * .pi / 180 } }
let angle: CGFloat = 45°
。しかし、それがa CGFloat
またはいずれかのFloatingPoint
タイプを期待する場所では必要ありませんCGAffineTransform(rotationAngle: 45°)
変数名を作成するときに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
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 { ... }
return .pi * degrees / 180
か?
T
はFloatingPoint
タイプであり、180はInt
タイプです。Swiftでは、異なるタイプの計算はできません。
上記と同じ原則@ t1serを使用しますが、次数の拡張を作成CGFloat
して、次数にも小数を使用しやすくします(たとえば、23.4度にすることができます)。
extension CGFloat {
func degrees() -> CGFloat {
return self * .pi / 180
}
init(degrees: CGFloat) {
self = degrees.degrees()
}
}
それを使用することも非常に簡単です(主に私が個人的に°typeを入力する方法を知らなかったため-どちらかを知らなかった場合、それはoption+shift+8
btwです):
let degreesToConvert: CGFloat = 45.7
.
.
.
let convertedDegrees = degreesToConvert.degrees()
または、イニシャライザを使用するには:
let convertedDegrees = CGFloat(degrees: 45.3)
迅速な2.3
func kilometersBetween(Place1:CLLocationCoordinate2D , Place2:CLLocationCoordinate2D) -> Double{
var start = MKMapPointForCoordinate(Place1)
var finish = MKMapPointForCoordinate(Place2)
print(MKMetersBetweenMapPoints(start, finish) / 1000)
return MKMetersBetweenMapPoints(start, finish) / 1000
}