Всем привет! Я ведущий разработчик cocos2d-objc. В настоящее время мы находимся в процессе портирования на Swift. Я планирую освещать процесс разработки, рассказывать об архитектурных решениях и т. д. Пока проект все еще на стадии проверки концепции, поэтому сегодня я расскажу лишь о небольшой хитрости, которая, на мой взгляд, имеет сделали нашу математическую библиотеку немного лучше.
Если интересно, смотрите кат.
Прежде чем начать переписывать движок на Swift, стала очевидна необходимость современной библиотеки для математических нужд. Изначально движок был ориентирован на X-платформу, поэтому мы не могли использовать типы CG*, а API CoreGraphics не был для нас достаточно Swift. Существующие решения нас не удовлетворили, поэтому мы решили написать свой велосипед, придерживаясь при этом определенного аскетизма.
Мы ограничились скромным набором типов: Vector2f, Vector3f, Vector4f, Matrix3f, Matrix4f, Rect .
Мы твердо решили, что хотим полностью устранить накладные расходы ARC и определенно хотим иметь поддержку.
SIMD (по крайней мере, для Дарвин платформы для Глибк пока алгоритмы писались вручную, пока simd не стал общедоступным), по этой причине пришлось отказаться от дженериков и строить всю библиотеку на типе Плавать , без поддержки Двойной .
Ок, я понимаю, что вам это не интересно, это введение.
О чем эта статья? В какой-то момент мы поняли, что API, работающий с углами (например, методы создания матрицы вращения и т. д.), нуждается в доработке.
Проблема, которая показалась нам важной, заключалась в том, чтобы избавить пользователей от необходимости просматривать документацию, чтобы увидеть, что метод ожидает получить: радианы или градусы.
Изначально мы хотели создать псевдонимы для Float, например:
Понятно, что это не особо помогает, потому что.typealias Radians = Float; typealias Degrees = Float;
Еще есть вероятность передать в метод неправильное значение.
Мы также рассмотрели создание функций rad() и deg(), которые возвращали бы желаемое значение.
Варианты расширений Int и Float, а также их литералы вида 45.degrees
180.radians
Нам это не понравилось, потому что.
разрешено делать: 180.radians.radians
В результате было принято решение создать для типа Угол отдельную структуру: /// A floating point value that represents an angle
public struct Angle {
Теги: #swift 3 #безопасность типов #методы #математика #Cocos2d #Fiber2D #строгая типизация #разработка для iOS #Swift #разработка для MacOS
-
Конференции Рунета 2014
19 Oct, 24 -
Сборная Солянка Из Виджетов
19 Oct, 24 -
Пластиковая Дробь: Нетипичные Патроны
19 Oct, 24 -
Переполнение Стека Закята
19 Oct, 24