Поради, щоб стати кращим розробником Swift

Swift надає функції, які допомагають розробникам коду безпечніше, швидше, читабельніше та надійніше щодо Objective-C. Ось кілька накреслених порад Swift, які ми зібрали завдяки досвіду використання цієї нової мови (Swift). Вони допомогли нам написати код більш безпечно та чисто.

Я розділив цю дискусію на два розділи. У першому ми обговорюємо для тих, хто починає швидко, а в другому - обговорюють, хто вже використовує.

Поради для початківця

1. Використовуйте майданчик для перевірки:

Кожного разу, коли ви збираєтесь реалізувати будь-який логічний експеримент і перевірити його на дитячому майданчику, його можна використовувати також для навчальних цілей.
Ігровий майданчик - це дуже простий та інтерактивний інструмент для швидкої роботи. На дитячому майданчику не потрібно створювати новий проект . Щоб створити майданчик просто, виберіть варіант із запуску Xcode:

Ігровий майданчик також можна створити в межах Xcode:

Після того, як ви перебуваєте на ігровому майданчику, ви можете написати код з лівого боку, а результат буде праворуч і внизу:

2. Безпечне використання додаткових пристроїв:

Необов’язковий - це властивість, яка може мати дійсне значення або нічого (нуль). Щоразу, коли ми збираємося надрукувати необов'язково. Це значення буде надруковано додатковим текстом як необов’язкове (значення). Ми можемо неявно розгортати необов'язковий, використовуючи знак оклику (!) В кінці необов’язкової назви властивості, але нам слід уникати цього. Це відоме як насильно розгортання, призводить до збоїв у програмі. Тож використання знака оклику (!) - небезпека .

Існує якась особлива умова, в якій використовується знак оклику (!).
Наприклад: IBOutlet, коли ви будете створювати розетки з конструктора інтерфейсів, це буде неявно розгорнуто необов'язково, тому що UIKit передбачає, що ви підключили / підключили вашу розетку до побудови інтерфейсу . Тож ризиковано неявно розгортати необов’язкове значення.
Ми можемо використовувати, якщо дозволити шаблон для вирішення цього:

var var: String? = "Радість"
var lastName: Рядок?
print (назва) // Результат: Необов’язково ("Радість")
друк (ім’я!) // Результат: Радість
якщо нехай value = name {
    друк (значення)
} else {
    print ("ім'я не встановлено")
}
// Результат: радість, тому що ім'я має значення
якщо нехай lastNameNew = lastName {
    друк (lastNameNew)
} else {
    print ("прізвище не встановлено")
}
// Результат: прізвище не встановлено, оскільки lastName не має жодного значення

3. Керування константами в одному файлі:

Щоб керувати константами вашого проекту, створіть файл і керуйте лише тут. Впорядкуйте всі константи в структурі або перерахунку як:

enum AppConstants {
   static let AppName = "MyFirstApp"
   static let NoInternetMessage = "Вибачте! Немає підключення до Інтернету"
}

Це дуже допомагає повною мірою керувати та підтримувати читабельність вашого коду.
Скажімо, ви використовували NoInternetMessage у багатьох місцях свого коду програми, і тепер вам потрібно внести деякі зміни в повідомлення, щоб ви могли легко змінити повідомлення лише в одному місці, воно відображатиметься автоматично всюди.

4. Використання вкладеної функції:

Ви можете визначити функцію з в органах іншої функції, відомих як вкладені функції.
Вкладені функції будуть приховані від зовнішнього світу, але їх можна викликати і використовувати їх функцією, що вкладається. Функція, що додає, також може повернути їх вкладену функцію, так що вона може бути використана у зовнішньому світі чи в іншій області застосування.
Це підвищить читабельність та повторне використання коду.

func selectStepFunction (назад: Bool) -> (Int) -> Int {
   func stepForward (вхід: Int) -> Int {return input + 1}
   func stepBackward (вхід: Int) -> Int {return input - 1}
   повернутися назад? stepBackward: крок вперед
}
var currentValue = -4
нехай moveNearerToZero = selectStepFunction (назад: currentValue> 0)
// moveNearerToZero тепер посилається на вкладену функцію stepForward ()
в той час як currentValue! = 0 {
   print ("\ (currentValue) ...")
   currentValue = moveNearerToZero (currentValue)
}
print ("нуль!")
// Результат:
// -4 ...
// -3 ...
// -2 ...
// -1 ...
// нуль!
Ще одна остання порада для вас, хлопці, ви можете також скористатися порадами професіоналів.

Поради професіоналам

  1. Використання охорони:

Коли будь-яка дія виконується, ви хочете бути впевнені, що всі необхідні дані є там, щоб вони працювали належним чином. Тоді зазвичай розробники вирішували це двома способами, а саме:

а. Піраміди приреченості:

Коли розробник хоче бути впевненим в усіх необхідних даних, перевіряє кожне використовуване властивість, як:

var userName: Рядок?
var email: Рядок?
var пароль: Рядок?
var policyAccepted: Bool = false
func checkAndSave () {
   якщо нехай uname = userName {
      якщо нехай пошта = електронна пошта {
         якщо нехай pwd = пароль {
            якщо policyAccepted {
               // робити велику справу, як реєстрація
            }
         }
      }
   }
}

Він відомий як піраміди приреченості, тому що ми створюємо піраміду умов.

б. Умовне повернення:

Пізніше піраміди приреченості розробники перетворили його на умовне повернення, перевірку для кожного використовуваного властивості та повернення, як:

func checkAndSave () {
   якщо нехай uname = userName {return}
   якщо нехай пошта = електронна пошта {return}
   якщо нехай pwd = пароль {return}
   if policyAccepted {return}
   
   // робити велику справу, як реєстрація
}

Він відомий як умовне повернення, тому що ми повертаємося при кожній недостатності умови .
- Перше рішення не є гарним у сенсі читабельності коду та налагодження, тому ми не будемо його робити.
- Друге рішення теж недостатньо добре, тому що бути непотрібним поверненням із функції, чи не можемо отримати, чому ми повернули його?
- Ще одне рішення, яке ми можемо використати, якщо дозволити, але воно також має деякі обмеження, оскільки область змінної буде в блоці if, тож вона знову підводиться до піраміди приреченості .

Отож, тут з'являється концепція гвардії нехай, введена у швидкому 2.0. Це так просто і просто у використанні, умови і випущені заяви можна використовувати разом together, можна використовувати як:

func checkAndSave () {
guard let uname = userName, let = = email, нехай pwd = пароль, policyAccepted else {
   повернення
}
// робити велику справу, як реєстрація
}

2. Використання відкладного блоку:

defer - це блок, означає "Деякі вказівки, які я хочу виконати пізніше, незалежно від того, що це?". Він може містити один рядок коду або купу рядків коду. Ми можемо визначити блок відкладання у функції, яка буде викликати виклик, коли виконання функції закінчується . Це також зменшує надмірність коду.
- Скажімо, ви створюєте об'єкт будь-якого ресурсу у функції та використовуєте ключове слово Guard, щоб перевірити щось або повернути виконання з будь-якої умови, тоді або ваш ресурс залишиться в пам'яті, або вам доведеться звільнити його, перш ніж закінчити виконання функції. Таким чином, це призведе до надмірності коду або помилково ви можете залишити ресурс у пам'яті . Щоб уникнути цієї ситуації, ми можемо записати код випуску ресурсів у відкладений блок . як:

func processFile (назва файлу: String) кидає {
   якщо існує (ім'я файлу) {
      нехай файл = відкрито (назва файлу)
      // Тут визначений блок відстрочки для закриття відкритого файлу
      відкладати {
         закрити (файл)
      }
      нехай userName = getUserName ()
      guard userName! = "" else {return}
      file.write (userName)
      нехай userAge = getUserName ()
      guard userAge> = 18 else {return}
      file.write (userAge)
      
      // закриття (файл) викликається тут, в кінці області.
   }
}

3. де ключове слово:

Раніше швидко, якщо ви хочете використовувати відповідність шаблону з умовою, тоді ви повинні використовувати два, якщо заяви окремо, як:

var webUrl: Рядок? = "https://medium.com"
якщо дозволити path = webUrl {
   якщо path.hasPrefix ("https") {
      // робити велику справу
   }
}

Пізніше Swift представив, де ключове слово у версії 2.0 робить те саме, що відбувається в одному операторі, як:

якщо дозволити path = webUrl, де path.hasPrefix ("https") {
   // робити велику справу
}

Тепер Swift замінив ключове слово на знак ((кома) таким чином:

якщо дозволити path = webUrl, path.hasPrefix ("https") {
   // робити велику справу
}

Отже, де більше використовувати повне. Детальніше про те, де.

4. Зробіть власну делегацію слабкою:

Зачекайте… що слабке і делегат? Давайте перевіримо це на розробнику яблук для точного визначення.
Слабка посилання - це посилання, яке не тримає сильної позиції щодо екземпляра, на який він посилається, і тому не перешкоджає ARC розпоряджатися посиланням на цей екземпляр.
Делегування - це модель дизайну, яка дозволяє класу чи структурі передавати (або делегувати) деякі свої обов'язки екземпляру іншого типу.

Кожного разу, коли ви призначаєте делегата будь-якого класу A класу B, ви зберігаєте чітке посилання на клас A у класі B, а клас A також буде зберігати чітке посилання на клас B як делегат. Таким чином, це призведе до циклу збереження об'єктів, і виникнуть проблеми, пов'язані з пам'яттю, і додаток вийде з ладу .

Отже, наступного разу, коли ви збираєтеся створити власні делегати, тоді переконайтеся, що вони створюються як слабка посилання , як:

протокол myCustomDelegation: клас {
   func newFunction (vaueToBeShare: String)
}
клас А {
   слабкий вар-делегат: myCustomDelegation?
   // зробити делегат як слабкий, щоб порушити цикл утримування
}
клас B: myCustomDelegation {
   внутрішня функція newFunction (vaueToBeShare: String) {
      // роби щось тут, коли делегата звільняють
   }
   нехай obj = A () // зберігає чітке посилання на клас A
   в цьому() {
      obj.delegate = self // присвоєння класу A делегату класу B
   }
}

5. Пропустіть використання KVO:

KVO (Key Value Observer), де ви можете встановити та спостерігати за будь-яким ключем та дією, коли значення цього ключа змінюється. Це добре, але не краще підхід швидко, тому що ми деякий час забули зняти спостерігача, що призведе до збоїв у програмі, або спостерігачі завжди транслювались, так що впоратись з болем.

Ми замінили KVO у швидкому режимі, який є спостерігачем власності. Використовуючи його, ми можемо отримати дію, коли значення властивості буде змінено. Існує :

  • willSet викликається безпосередньо перед збереженням значення.
  • didSet викликається відразу після збереження нового значення.
class newClass {
   var myNewObj: Int = 0 {
      willSet (newValue) {
         print ("newValue = \ (newValue), oldValue = \ (myNewObj)")
      }
 
      didSet {
         print ("oldValue = \ (oldValue), currentValue = \ (myNewObj)")
      }
   }
}
нехай obj = newClass ()
obj.myNewObj = 5
// Результат: newValue = 5, oldValue = 0
// Результат: oldValue = 0, currentValue = 5
obj.myNewObj = 8
// Результат: newValue = 8, oldValue = 5
// Результат: oldValue = 5, currentValue = 8

Спостерігачі willSet і didSet для myNewObj викликаються кожного разу, коли властивості присвоюється нове значення. Це справедливо, навіть якщо нове значення збігається з поточним значенням .

Якщо ви змінюєте значення властивості1 у спостерігача за властивістю властивості2 та властивості2 у спостерігача за властивістю властивості1, воно створить ланцюжок, видасть помилку помилки виконання під час виконання, нічого не скаже під час компіляції.

6. Використовуйте кілька дощок:

Роздільна дошка - це візуальне зображення користувальницького інтерфейсу програми iOS, що показує екрани вмісту та зв’язки між цими екранами.
Xcode створює дошку історії за замовчуванням, і розробники використовують її для повного застосування, тому вона стає монстром і збільшує час завантаження вашого проекту в Xcode, а також час запуску вашої програми на пристрої,
Тому спробуйте створити у вашому додатку декілька розкладок.

"Використовувати раскадровку для повної історії, а не для повного проекту"

Коли ми використовуємо декілька дощок, ми можемо створити контролери перегляду різними способами, щоб глибоко прочитати цю статтю про використання декількох мов.
Кілька розкладок можна використовувати як:

enum AppStoryboards: String {
   case Main = "Головна"
   case PreLogin = "PreLogin"
   var екземпляр: UIStoryboard {
      повернути UIStoryboard (ім'я: self.rawValue, пакет: nil)
   }
}
// ВИКОРИСТАННЯ:
нехай розповідь = AppStoryboard.Main.instance
нехай loginVC = AppStoryboard.PreLogin.instan.instantiateViewController (withIdentifier: "LoginVC")
// Старий шлях
нехай розповідь = UIStoryboard (назва: "Головна", група: Bundle.main)

7. Пропустіть використання глобулів:

Це хороша практика використання глобальних змінних та функцій, може допомогти нам зробити чистий код та збільшити повторне використання коду. Але мені буде краще використовувати розширення для того ж. Тому що, створюючи глобальний клас, ми створюємо "клас БОГА". Тож давайте розділити завдання глобального класу за допомогою розширень, зробить код більш чистим, читабельним та багаторазовим.

Подібно до:

// Середня практика
Функ квадрат (x: Int) -> Int {return x * x}
нехай square3 = квадрат (x: 3) // Друк: 9
квадрат (х: квадрат3) // Друк: 81
// Велика практика
розширення Int {
   вар квадрат: Int {return self * self}
}
3.квадра // Друк: 9
3.square.square // Друк: 81

Отримайте кілька розширень від GitHub.

8. Використовуйте жанри:

Generics дозволяє оголосити змінну, яка при виконанні може бути призначена набору визначених нами типів.

// Середня практика
var stateName = ["Уттар-Прадеш", "Керала", "Ассам", "Пенджаб"]
var areaArray = [240928, 38863, 78438, 50362]
зростання вар = [20,1, 4,9, 16,9, 13,7]
func printStateName (obj: [String]) {print ("stateNames: \ (obj)")}}
func printStateArea (obj: [Int]) {print ("області: \ (obj)")}
func printStateGrowth (obj: [Double]) {print ("приріст населення: \ (obj)")}
printStateName (obj: stateName)
printStateArea (obj: areaArray)
printStateGrowth (obj: зростання)
// Велика практика
func printArray  (_ obj: T, повідомлення: String = "") {print ("\ (повідомлення) \ (obj)")}
printArray (stateName, повідомлення: "stateNames:")
printArray (areaArray, повідомлення: "areas:")
printArray (зростання, повідомлення: "приріст населення:")

Дякуємо, що прочитали, будь ласка, натисніть на рекомендацію, якщо сподобалась ця колекція