1.4Kпросмотров
39.3%от подписчиков
11 марта 2026 г.
📷 ФотоScore: 1.5K
🐥 Фишки Swift, о которых многие забывают
Swift оброс синтаксическим сахаром, и часть классных фич теряется в шуме. По мелким фишкам даже пишутся целые статьи, но гораздо полезнее перечитывать официальный гайд по языку. Собрал для вас несколько фишек, какие сам часто использую: 1. Паттерн‑матчинг в switch
let value: Int? = Int.random(in: 0...10) switch value {
case let .some(v) where v > 5: print("Большое число: \(v)")
case let .some(v): print("Маленькое число: \(v)")
case .none: print("nil")
}
let .some(v) — это как if let, но прямо внутри switch, плюс можно сразу вешать дополнительные условия через where 2. Нюансы работы со строками
Со строками в Swift раньше было больно работать, но у стандартной библиотеки есть несколько новых фишек:
🔵Безопасные индексы вместо str[i]
let s = "Привет" let firstIndex = s.startIndex
let secondIndex = s.index(after: firstIndex)
let secondChar = s[secondIndex] // "р" 🔵Срезы:
let prefix = s.prefix(3) // "При"
let suffix = s.suffix(2) // "ет" 🔵Реальная задача - обрезать строку до N символов и добавить многоточие:
func truncated(_ string: String, limit: Int) -> String { guard string.count > limit else { return string } let endIndex = string.index(string.startIndex, offsetBy: limit) return String(string[string.startIndex..<endIndex]) + "…"
} truncated("Привет, мир!", limit: 6) // "Привет…"
🔵Вместо NSRange/NSString давно можно обойтись чистым Swift:
let text = "https://example.com - мой сайт"
if let range = text.range(of: "https://") { let prefix = text[..<range.lowerBound] // перед URL let urlPart = text[range.lowerBound...] // начиная с URL print(prefix) // "" print(urlPart) // "https://example.com - мой сайт"
}
🔵Вообще работать со строкой можно как с обычной коллекцией:
let sentence = "Hello, Swift world!" let words = sentence
.split { $0.isWhitespace || $0.isPunctuation }
.map(String.init) print(words) // ["Hello", "Swift", "world"] 3. Массивы
🔵Иногда нужно получить массив фиксированной длины, уже заполненный значением по умолчанию, это можно сделать через конструктор:
let zeros = Array(repeating: 0, count: 10)
// [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] let placeholders = Array(repeating: "—", count: 5)
// ["—", "—", "—", "—", "—"]
🔵Еще часто забывают про reduce(into:). Если обычный reduce возвращает новый массив/значение, то reduce(into:) позволяет изменять уже существующую структуру без лишних копий
let names = ["Alice", "Bob", "Eve", "Alex", "Ben"] let grouped = names.reduce(into: [Character: [String]]()) { result, name in guard let first = name.first else { return } result[first, default: []].append(name)
} // ["A": ["Alice", "Alex"], "B": ["Bob", "Ben"], "E": ["Eve"]]
По сути — мини‑groupBy на стандартной библиотеке. 🔵 zip — проход по двум массивам параллельно
let titles = ["Intro", "Chapter 1", "Chapter 2"]
let pages = [1, 5, 17] for (title, page) in zip(titles, pages) { print("\(title) начинается на странице \(page)")
}
🔴Здесь важно помнить: длина берётся по минимальному из двух массивов — лишние элементы отбрасываются. 🔵Срезы массивов и prefix/suffix работают и тут:
let numbers = [1, 2, 3, 4, 5, 6] let firstThree = numbers.prefix(3) // [1, 2, 3]
let lastTwo = numbers.suffix(2) // [5, 6] // Срез → обратно в Array при необходимости:
let firstThreeArray = Array(firstThree)
Ставь 👍 если нашел для себя что-то новое и 🤔 если знал все из этого списка