Вот еще 10 советов, которые вы можете использовать в своих iOS-проектах.
1. Составляйте интерфейсы из компонентов
Разбейте представления на более мелкие части, чтобы сделать их более читаемыми.
Если хотите, сделайте еще один шаг вперед и создайте несколько многократно используемых представлений, чтобы избежать дублирования кода.
struct HomeView: View { var body: some View { VStack { headerView mainView footerView } } } // MARK: - UI Components private extension HomeView { var headerView: some View {...} var mainView: some View {...} var footerView: some View {...} }
2. Переиспользуйте стилизацию с помощью модификаторов представления
Если у вас есть пользовательские стили, которые повторяются во всем приложении, воспользуйтесь модификаторами представлений SwiftUI, чтобы сохранить код в одном месте.
struct TitleStyle: ViewModifier { func body(content: Content) -> some View { content .font(.system(size: 22, weight: .bold)) .foregroundColor(Color.black) } } extension View { func titleStyle() -> some View { modifier(TitleStyle()) } } struct HomeView: View { var body: some View { Text("Hello!") .titleStyle() } }
3. Включите модульные тесты
Это один из самых недооцененных процессов, который значительно улучшит качество кода.
Добавляя в код новый фрагмент логики, подумайте, как вы обеспечите его корректность. Напишите модульные тесты и запустите их в работу. Впоследствии это сэкономит массу времени.
4. Обрабатывайте ошибки
Не бойтесь использовать throw
. Это отличный способ обрабатывать ошибки без особых усилий.
enum NetworkError: Error { case fetching(Error) } func fetchData(from url: URL) throws -> Data { do { let data = try Data(contentsOf: url) return data } catch { throw NetworkError.fetching(error) } } func fetchProducts() throws -> [Product] { let productsURL = URL(string: "https:\\myapi.com/products") let data = try fetchData(from: productsURL) return try JSONDecoder().decode([Product].self, from: data) } do { let products = fetchProducts() } catch NetworkError.serverError(let message) { print("Server error: \(message)") } catch NetworkError.networkError(let error) { print("Network error: \(error.localizedDescription)") } catch { print("An unknown error occurred: \(error)") }
5. Документируйте код
Я твердо убежден, что лучшая документация — это автодокументированный код. Однако если вы разрабатываете сложный API или библиотеку, создание пользовательской документации поможет другим лучше понять интерфейсы вашего кода.
Добавить ее очень просто: достаточно дважды щелкнуть на нужной функции и нажать кнопку Add Documentation
.
/// Create a new request with the information provided /// ```swift /// do { /// let request = try createRequest(from: .signing) /// } catch { /// print(error) /// } /// ``` /// - Parameter endpoint: Endpoint to perform the request /// - Returns: A URLRequest instance with the information provided in `endpoint` func createRequest(from endpoint: ApiEndpoint) throws -> URLRequest {...}
6. Перечисления
Перечисления используются при необходимости моделирования состояний, опций или конфигураций. Они обеспечивают безопасный для типов и самодокументируемый способ представления данных.
Вы можете добиться большего, чем думаете.
enum AppTheme { case light case dark case custom(primaryColor: Color, backgroundColor: Color) }
7. Core Data + SwiftUI
Если вы используете в своем приложении Core Data, то для получения данных непосредственно в представлении используйте обертку свойства @FetchRequest.
struct HomeView: View { @FetchRequest(sortDescriptors: [SortDescriptor(\.id, order: .reverse)]) private var users: FetchedResults<User> var body: some View { VStack { List(users) { user in Text(user.name ?? "Unknown") } } } }
8. Руководство по стилю
Определите руководство по стилю для своей команды, чтобы обеспечить набор соглашений по программированию и лучших практик для поддержания согласованности в рамках проекта.
Руководство по стилю может включать такую информацию, как:
- Соглашения об именовании
- Форматирование кода
- Документация
- Файлы и структура проекта
- Работа с ошибками
- Использование возможностей языка Swift
- Лучшие практики тестирования
9. Инъекция зависимостей
Используйте ее для повышения модульности, сопровождаемости и тестируемости кода. DI продвигает принцип единой ответственности, побуждая компоненты фокусироваться на одной задаче.
10. Дизайн-система
Создайте систему дизайна для гибкого и многократно используемого управления всеми компонентами пользовательского интерфейса. Это поможет масштабировать приложение и адаптироваться к возможным изменениям в будущем.
Если вы никогда не создавали дизайн-систему, хорошей отправной точкой будет определение менеджера для шрифтов и текстов вашего приложения. Его можно объединить с пользовательскими модификаторами вида и создать визуальное представление, которое будет служить руководством к действию.