Swift Language
Соглашения стилей
Поиск…
замечания
У Свифта есть официальный стиль руководства: Swift.org API Design Guidelines . Еще один популярный справочник - официальный путеводитель Swift Style от Raywenderlich.com.
Очистить использование
Избегайте неоднозначности
Название классов, структур, функций и переменных должно избегать двусмысленности.Пример:
extension List {
public mutating func remove(at position: Index) -> Element {
// implementation
}
}
Вызов функции этой функции будет выглядеть следующим образом:
list.remove(at: 42)
Таким образом, избегается двусмысленность. Если вызов функции был бы просто list.remove(42)
было бы неясно, будет ли удален элемент, равный 42, или если элемент в индексе 42 будет удален.
Избегайте избыточности
Название функций не должно содержать избыточной информации.Плохой пример:
extension List {
public mutating func removeElement(element: Element) -> Element? {
// implementation
}
}
Вызов функции может выглядеть как list.removeElement(someObject)
. Переменная someObject
уже указывает, что элемент удален. Было бы лучше, чтобы подпись функции выглядела так:
extension List {
public mutating func remove(_ member: Element) -> Element? {
// implementation
}
}
Вызов этой функции выглядит так: list.remove(someObject)
.
Именование переменных в соответствии с их ролью
Переменные должны быть названы их ролью (например, поставщиком, приветствием) вместо их типа (например, фабрика, строка и т. Д.).Высокая связь между именем протокола и именами переменных
Если имя типа описывает его роль в большинстве случаев (например, Iterator), тип должен быть назван суффиксом `Type`. (например, IteratorType)Предоставьте дополнительные сведения при использовании слабо типизированных параметров
Если тип объекта явно не указывает на его использование в вызове функции, функция должна быть названа с предшествующим существительным для каждого слабо типизированного параметра, описывающего его использование.Пример:
func addObserver(_ observer: NSObject, forKeyPath path: String)
к которому вызов будет выглядеть как `object.addObserver (self, forKeyPath: path)
вместо
func add(_ observer: NSObject, for keyPath: String)
к которому вызов будет выглядеть как object.add(self, for: path)
Свободное использование
Использование естественного языка
Вызов функций должен быть близок к естественному английскому языку.Пример:
list.insert(element, at: index)
вместо
list.insert(element, position: index)
Именование методов фабрики
Фабричные методы должны начинаться с префикса `make`.Пример:
factory.makeObject()
Именование параметров в инициализаторах и заводских методах
Имя первого аргумента не должно быть связано с присвоением имени фабричному методу или инициализатору.Пример:
factory.makeObject(key: value)
Вместо:
factory.makeObject(havingProperty: value)
Именование по побочным эффектам
- Функции с побочными эффектами (mutating functions) следует называть с помощью глаголов или существительных с префиксом
form-
. - Функции без побочных эффектов (nonmutating functions) должны быть названы с использованием существительных или глаголов с суффикс
-ing
или-ed
.
print(value)
array.sort() // in place sorting
list.add(value) // mutates list
set.formUnion(anotherSet) // set is now the union of set and anotherSet
Немутативные функции:
let sortedArray = array.sorted() // out of place sorting
let union = set.union(anotherSet) // union is now the union of set and another set
Булевы функции или переменные
Заявления, связанные с булевыми, должны читаться как утверждения.Пример:
set.isEmpty
line.intersects(anotherLine)
Протоколы именования
- Протоколы, описывающие, что что-то нужно называть, используют существительные.
- Протоколы, описывающие возможности, должны иметь
-able
,-ible
или-ing
как суффикс.
Collection // describes that something is a collection
ProgressReporting // describes that something has the capability of reporting progress
Equatable // describes that something has the capability of being equal to something
Типы и свойства
Типы, переменные и свойства должны читаться как существительные.Пример:
let factory = ...
let list = [1, 2, 3, 4]
капитализация
Типы и протоколы
Имена типов и протоколов должны начинаться с буквы верхнего регистра.
Пример:
protocol Collection {}
struct String {}
class UIView {}
struct Int {}
enum Color {}
Все остальное...
Переменные, константы, функции и случаи перечисления должны начинаться с строчной буквы.
Пример:
let greeting = "Hello"
let height = 42.0
enum Color {
case red
case green
case blue
}
func print(_ string: String) {
...
}
Случай верблюда:
Все имена должны использовать соответствующий верблюд. Верхний верблюжковый футляр для имен типов / протоколов и нижний корпус верблюда для всего остального.
Верхний верблюд:
protocol IteratorType { ... }
Нижняя часть верблюда:
let inputView = ...
Сокращения
Сокращения следует избегать, если они не используются (например, URL, ID). Если используется аббревиатура, все буквы должны иметь один и тот же случай.
Пример:
let userID: UserID = ...
let urlString: URLString = ...