Swift Style Guide. Часть 1. Наименования
Давно интересовался как профессиональные iOS разработчики стилизируют свой код. Наткнулся на статью Ray Wenderlich про Swift стайлгайд от него https://github.com/raywenderlich/swift-style-guide и решил поделиться ею на русском языке. Сейчас речь пойдет о первой главе Наименования
Общие правила:
- Ясно и понятно называйте переменные/функции
var a // Плохо
var user // Хорошо- Объявляйте переменные кратко, но не забывайте про первый пункт
- Используйте ГорбатыйРегистр
var userlist // Плохо
var userList // Хорошо- Используйте Заглавные буквы для наименования типов(классов, структур, протоколов), для остального прописные буквы
class list { // Плохо
}
class List { // Хорошо
}- Включайте только все необходимые слова в названия
var annotation // Плохо
var userAnnotationView // Хорошо- Название должно обозначать роль, а не тип объекта
var integer // Плохо
var count // Хорошо- Методы, которые играют роль создания чего-либо начинаются со слова make
func customButton() { //Плохо
}func makeCustomButton() { //Хорошо
}
- Методы с глаголами называют по правилу -ed, -ing для неизменяемых методов
- Булевые методы должны читаться как утверждение (например isHiden)
- Протоколы, описывающие что-то, должны быть существительными
- Протоколы, описывающие что ты должен сделать, должны оканчиваться на -able или -ible
- Используйте выражения, которые не удивляют профессионалов и не пугают начинающих разработчиков
- Желательно вообще избегать сокращений
- Предпочитайте методы и свойства простым функциям
- Названия метода должно соответствовать его значению
func appentUserToList() {
//считает овец
} // Плохо
func appentUserToList() {
//добавляет пользователя
} // Хорошо- Выбирайте понятные названия для параметров. Они могут служить как мини документация
func appentUserToList(a: User, b: [String]) {
} // Плохо
func appentUserToList(user: User, listOfUsers: [String]) {
//добавляет пользователя
} // Хорошо- По возможности используйте параметры по умолчанию
Понятность:
Когда речь идет о методах, то называть их надо по следующим правилам:
- Пишите названия методов без параметров. Например: addTarget
- Пишите методы с названиями агрументов. Например: далее делаем addTarger(_:action:)
- Дальше напишите полное имя метода с описанием и типом параметров. Например: addTarget(_: Any?, action: Selector?).
Профессиональные фишки: Можно использовать Xcode на каком-либо объекте/классе и посмотреть как наименовывают методы:

Делегаты
При создании методов делегата, неназванный первый параметр должен быть делегатом (UIKit содержит многочисленные примеры этого)
func namePickerView(_ namePickerView: NamePickerView, didSelectName name: String)
func namePickerViewShouldReload(_ namePickerView: NamePickerView) -> Bool
//Хорошоfunc didSelectName(namePicker: NamePickerViewController, name: String)
func namePickerShouldReload() -> Bool
//Плохо
Использовать тип зависимого контекста
Используйте компилятор для вывода более короткого, чистого кода.
let selector = #selector(viewDidLoad)
view.backgroundColor = .red
let toView = context.view(forKey: .to)
let view = UIView(frame: .zero)
//Хорошоlet selector = #selector(ViewController.viewDidLoad)
view.backgroundColor = UIColor.red
let toView = context.view(forKey: UITransitionContextViewKey.to)
let view = UIView(frame: CGRect.zero)
//Плохо
Generics
Параметры типов в дженериках должны быть описаны именами в горбатом стиле. Если имя типа не имеет значимых отношений или роли, используйте традиционную прописную букву, такую как T, U или V.
struct Stack<Element> { ... }
func write<Target: OutputStream>(to target: inout Target)
func swap<T>(_ a: inout T, _ b: inout T)
//Хорошоstruct Stack<T> { ... }
func write<target: OutputStream>(to target: inout target)
func swap<Thing>(_ a: inout Thing, _ b: inout Thing)
//Плохо
Язык
Используйте US английский. Это так же рекомендует делать Apple’s API.
let color = "red"
//Хорошоlet colour = "red"
//Плохо
Просьба
Может я где-то мог неграмотно рассказать о чем-то, если заметите неточность, то сообщите и я поправлю:)
