Кто-нибудь знает, почему разница?
Вы только что совершили простую ошибку группировки.
Как вы выяснили, Objective-C и Swift требуют преобразования при преобразовании значения с плавающей запятой в целое, поэтому вы написали (int)a
для первого и Int(a)
для последнего.
Вы также поняли, что преобразование целого числа в значение с плавающей запятой различается в двух языках, в Objective-C (и C, и во многих других языках) преобразование является неявным , тогда как в Swift это явно.
Единственная ошибка, которую вы допустили, это анализ Objective-C и, следовательно, создание неправильного Swift или , вы просто неправильно набрали Swift.
В арифметических выражениях операторы оцениваются в соответствии с приоритетом, соответствующим вашей задаче. Приведения тесно связаны со следующим выражением, затем выполняется умножение и деление, затем сложение и вычитание. Что это значит, ваша Цель-C:
a - (int) a / 360 * 360
анализируется как:
a - (double) ( (int) a / 360 * 360 )
обратите внимание, что приведение (double)
применяется к результату выражения (int) a / 360 * 360
. То, что вы написали в Swift:
a - Double(Int(a)) / 360 * 360
, что не то же самое, здесь приведение применяется только к Int(a)
. То, что вы должны были написать:
a - Double(Int(a) / 360 * 360)
, который применяет приведение к Int(a) / 360 * 360
так же, как Objective-C.
С этим исправлением в обоих языках умножение и деление работают на целые числа, а целочисленное деление усекается (например, 9/4 равно 2, а не 2,25). С неуместными круглыми скобками в Swift все умножение и деление работают на значениях с плавающей точкой.
TL; DR: Вы только что поставили круглые скобки.
НТН