Статьи

3 ужасные ошибки разработчиков iOS

Кодирование приложения для iOS — это тяжелая работа, поэтому имеет смысл, что разработчики хотят срезать углы и найти способы как можно быстрее вывести свое приложение в Интернет. Но успешное приложение будет долгое время — это годы исправления ошибок, улучшения функций и работы с другими программистами.

В этой статье я расскажу о трех вещах, которые следует избегать при разработке iOS, которые облегчат создание и поддержку ваших приложений.

Хотя кажется, что переменные более универсальны, чем константы, по-прежнему не рекомендуется использовать переменные по умолчанию, когда вместо них можно использовать константу. Так что же хорошего в константах? На самом деле много вещей!

Одна из лучших сторон констант — их читабельность. Давайте рассмотрим пример: вы пишете приложение типа электронной коммерции. Возможно, вы захотите добавить местную ставку налога с продаж в размере 8,75%, но другие разработчики не будут знать, что означает это число. Давайте посмотрим на пример:

Разработчик по имени Стивен входит в вашу команду, он ниндзя-программист, но живет в стране за границей. В этой стране нет такой вещи, как налог с продаж (счастливчик Стивен), и поэтому он ничего не знает об этом.

Если бы вы использовали переменную для вашей ставки налога с продаж, он мог бы изменить ее всего в одной строке кода, и результаты этого могли бы серьезно повредить вашему приложению. Простое изменение ключевого слова с var на let приведет к тому, что компилятор скажет ему, что значение нельзя изменить, и он поймет, что вы хотите, чтобы оно было неизменным.

Другой способ, который let использовать let — ссылаться на значение в вашем коде. Если вы делаете приложение, вам может потребоваться определенная цветовая схема. Вместо того, чтобы копировать ваши цвета туда, где они нужны, вы можете использовать константу для ссылки на этот конкретный цвет.

Таким образом, если вы хотите изменить цвет, вам просто нужно изменить его в одном месте, вместо того, чтобы находить каждую ссылку на цвет и менять ее несколько раз.

Когда вы создаете синглтон, вам также необходимо создать общий экземпляр класса. Обычно это можно сделать, объявив static let внутри объявления класса. После этого вы называете константу и присваиваете ее экземпляру класса и используете ее в своем приложении.

В добавление к этому, если вам нужно создать экземпляр (создать экземпляр) обычного класса, возможно, в ViewController.swift , вы создадите константу и назначите ее экземпляру нужного класса, оставив вам ссылку, которую вы легко можете создать. использовать во всем файле. Это еще одно замечательное использование констант.

Как видите, есть много причин, по которым константы велики. Они повышают читабельность кода, полезны для хранения неизменяемых значений и, очевидно, они не так бесполезны, как вы думаете. Сделайте себе одолжение, привыкнув использовать константы всякий раз, когда это возможно, и превращая их в переменные, только если вам абсолютно необходимо изменить их значения — это сделает вас лучшим программистом.

Дополнительные функции являются очень мощной функцией Swift. Это просто типы, такие как int и String , помеченные знаком вопроса после объявления типа. Если вы хотите объявить переменную как необязательную строку, вы просто напишите:

1
var someVariable: String?

Это говорит компилятору, что либо может быть значение, либо его вообще не может быть. String? и String считаются двумя различными типами.

Думайте об опциях как о подарочной коробке. Как я уже упоминал, эта подарочная коробка может иметь или не иметь значение, и если вы хотите это выяснить, вы должны сначала развернуть дополнительный. Есть много способов сделать это:

Эта операция (выполняется с помощью восклицательного знака) называется оператором взрыва. Не используйте это! Принудительное развертывание ваших переменных никогда не является хорошей идеей. Если значение необязательного параметра, который вы пытаетесь развернуть, равно нулю (ничего), ваше приложение завершится сбоем, и кто этого хочет? В любом случае, давайте посмотрим на следующий блок кода:

1
2
3
4
5
6
var someVariable: String?
var somethingElse: String = «hello»
 
func setupApp() {
    self.somethingElse = self.someVariable!
}

В этом примере приложение someVariable , потому что мы никогда не определяли значение для someVariable , и мы пытаемся присвоить его переменной типа String . Это побеждает целое назначение опционов, которые помогают защитить нас от подобных ошибок!

Давайте посмотрим на некоторые правильные способы решения этой же ситуации.

Это один из самых популярных методов борьбы с опционами. В этом методе вы просто присваиваете необязательное значение константе, используя оператор if . Если необязательный может быть развернут, компилятор входит в замыкание, и вы можете использовать созданную константу. В противном случае вы попадаете в else утверждение и делаете вид, что ничего не произошло. Давайте посмотрим на пример этого:

01
02
03
04
05
06
07
08
09
10
var someVariable: String?
var somethingElse: String = «hello»
 
func setupApp() {
    if let theThing = someVariable {
        self.somethingElse = self.someVariable!
    } else {
        print(«error»)
    }
}

Используя тот же пример, что и в прошлый раз, но с необязательным связыванием вместо этого, мы видим, что вместо сбоя компилятор вводит оператор else и печатает «error».

Другим распространенным способом безопасного развертывания опциональных устройств является необязательное создание цепочки. Это отличный способ избежать чистых значений в одну строку кода. Когда вы используете этот метод и сталкиваетесь с нулевым значением, эта строка кода просто перестает выполняться. Вот пример этого:

1
2
3
4
5
6
var someClass: SomeClass?
var somethingElse: String?
 
func setupApp() {
    self.somethingElse = someClass?.createString()
}

В основном, если someClass равно nil, вся строка не будет выполнена, а значениеthingElse станет nil. Если есть значение, как в примере выше, оно будет присвоено переменной somethingElse . В любом случае приложение не будет зависать.

Этот метод обрабатывает необязательные значения одной строкой, но в отличие от описанного выше метода, вам необходимо указать регистр по умолчанию или случай «else» (в случае, если необязательный параметр равен nil). Давайте посмотрим на пример:

1
2
3
4
5
6
var someVariable: String?
var somethingElse: String = «hello»
 
func setupApp() {
    self.somethingElse = someVariable ??
}

Хотя это может показаться немного загадочным, это просто означает, что если левый оператор имеет значение (другими словами, не ноль), он будет использоваться. Если это ноль, то будет использоваться оператор по умолчанию — в данном случае это жестко закодированная строка. Стоит отметить, что правое утверждение должен быть не нулевым и не необязательным типом (в противном случае цель этого будет побеждена).

Другой распространенной ошибкой является неспособность структурировать ваш код таким образом, чтобы он был устойчивым, поддерживаемым и эффективным. Многие люди встраивают весь свой код в свои классы ViewController , и это может затруднить изменение и отладку вашего кода.

Как бы это ни звучало клише, это действительно основа того, как вы программируете свое приложение. Допустим, вы строите дом, дом своей мечты. Этот дом высотой в пять этажей, поэтому, если вы не построите прочный фундамент и не будете следовать чертежам, он, вероятно, просто рухнет.

Основой приложения для iOS является выбранный вами шаблон дизайна. Давайте рассмотрим два наиболее часто используемых шаблона.

Шаблон проектирования Model-View-Controller или MVC разделяет каждую часть вашего кода на три части: модель, представление и контроллер.

  • Модель . Модель — это данные приложения. Это обрабатывает такие вещи, как многоразовые структуры и классы, которые имеют дело только   с данными приложения. Модель не обрабатывает ничего, касающегося представления или того, как информация будет показана пользователю.
  • Представление: представление отвечает только за визуальное представление данных, а также за взаимодействие с пользователем. Это не   обрабатывать что-либо, касающееся данных, и при этом оно не касается конкретных представлений. Это просто класс многократного использования, который можно использовать несколько раз без повторения кода.
  • Контроллер: Контролер является боссом. Он приносит данные из модели, а затем отправляет их в представление, чтобы, наконец, отобразить их пользователю. Обычно это файл ViewController.swift , который прослушивает ввод и изменяет модель по мере необходимости.

Есть много вариантов этого, таких как MVVM и MVP . Стоит почитать о них,   но принцип похож на MVC , поэтому мы не будем их здесь рассматривать. Все они называются шаблонами проектирования, и они делают наш код модульным.

Давайте рассмотрим другой шаблон дизайна, который может дополнить шаблон приложения, который вы выберете для использования.

Singleton — это единственный экземпляр класса, который постоянно присутствует в памяти. Итак, почему мы заботимся об этом? Ну, скажем, вы создаете приложение, которое подключается к базе данных. Вам нужно место, чтобы разместить все ваши соединения службы передачи данных. Это было бы идеальным местом для использования синглетонов. Посмотрите на код ниже; это покажет вам, как построить синглтон:

01
02
03
04
05
06
07
08
09
10
// Declaration
class DataService {
    static var shared = DataService()
     
    func createUser() {
    }
}
 
// Call-site
DataService.shared.createUser()

Если вы будете следовать этим простым советам, ваше приложение будет легче обслуживать, и ошибки станут более очевидными, чем ваши клиенты.

В этой статье мы увидели три ошибки, которые допускают разработчики приложений для iOS, что может упростить кодирование, но на самом деле в долгосрочной перспективе стоит гораздо больше работы.

Помните, что создание приложения — это только часть проблемы — вам также нужно исправлять ошибки, добавлять функции и делиться кодом с другими разработчиками. Следование рекомендациям, таким как использование констант, правильная обработка опций и использование архитектурных шаблонов, облегчит создание и поддержку вашего приложения.

Пока вы здесь, посмотрите другие наши посты о разработке приложений для iOS!

  • стриж
    Что нового в Swift 4
    Патрик Балестра
  • iOS SDK
    Realm Мобильная база данных для iOS
    Дорон Кац
  • iOS SDK
    Ускоренный вход в систему с паролем автозаполнения в iOS 11
    Патрик Балестра