Próbuję przekonwertować ten Obj-C
kod na Swift
kod, ale nie wiem, jaki powinien być odpowiednik tego kodu?
#define DEGREES_TO_RADIANS(degrees)((M_PI * degrees)/180)
Poszukałem w Google i znalazłem to
Ale nie rozumiem, jak przekonwertować to w Swift w moim przypadku?
Odpowiedzi:
Xcode 11 • Swift 5.1 lub nowszy
Plac zabaw
Jeśli chcesz, aby binarna liczba całkowita zwracała typ zmiennoprzecinkowy zamiast zawsze zwracać CGFloat, możesz utworzyć metodę ogólną zamiast obliczonej właściwości:
źródło
CGFloat
?To nie jest dokładnie to, o co prosiłeś, ale w Swift 3 / iOS 10 możesz użyć typu pomiaru i wykonać konwersję bez znajomości wzoru!
źródło
Apple udostępnia następujące funkcje GLKit do konwersji:
źródło
Kompiluje pod Swift 3 . Nadal zachowuj wszystkie wartości, wykonuj wszystkie obliczenia w radianach za pomocą CGFloats ..., ale spraw, aby kod był bardziej czytelny dzięki stałym w stopniach. Na przykład: 90 ° Znak ° w magiczny sposób zamienia stopnie na radiany.
Jak to ustawić:
Zdefiniuj i użyj operatora przyrostka dla znaku ° . Ten operator dokona konwersji ze stopni na radiany. Ten przykład jest dla Ints, rozszerz je również dla typów Float, jeśli masz taką potrzebę.
Kilka przykładów użycia:
Ostrzeżenie!
Zbyt łatwo jest użyć tej konwersji dwa razy (na wartości już w radianach przez pomyłkę), otrzymasz bardzo małą liczbę i pozornie wynikowy kąt będzie zawsze równy zero ... NIE używaj ° na tym samym wartość dwukrotnie (nie konwertuj dwukrotnie) !!:
źródło
IntegerInitializable
protokół jest bezcelowy. Int już sięExpressibleByIntegerLiteral
public extension FixedWidthInteger { postfix static func °<T: FloatingPoint>(lhs: Self) -> T { T(lhs) * .pi / 180 } }
let angle: CGFloat = 45°
. Ale to nie jest konieczne, jeżeli oczekuje sięCGFloat
lub dowolnyFloatingPoint
typCGAffineTransform(rotationAngle: 45°)
Ponadto, aby przekonwertować fron radianów na stopnie (jeśli ktoś natknie się na to w Google):
źródło
Nie jesteś już ograniczony do znaków ASCII podczas tworzenia nazw zmiennych, więc co powiesz na to, używając π (alt-p):
Przykładowe użycie:
źródło
Swift 4.2
Możesz pisać globalne funkcje ogólne:
Przykład:
W przypadku, gdy nie chcesz rozszerzać wszystkich typów pływających w ten sposób
źródło
return .pi * degrees / 180
?T
toFloatingPoint
typ, a 180 toInt
typ. Szybko nie możesz wykonywać obliczeń na różnych typach.Użyłbym tej samej zasady @ t1ser, o której wspomniano powyżej, ale utworzyłbym rozszerzenie,
CGFloat
aby ułatwić użycie ułamków dziesiętnych również dla stopnia (więc możesz mieć na przykład 23,4 stopnia):Używanie go również byłoby całkiem proste (głównie dlatego, że osobiście nie wiedziałem, jak wpisać ° 😜 - na wypadek, gdybyś ty też nie, to przy
option+shift+8
okazji):Lub użyj inicjatora:
źródło