Практические примеры работы с массивами Swift

В iOS-разработке массивы часто используются для работы с данными — от отображения списков в UITableView и UICollectionView до обработки сетевых запросов и управления состоянием приложения. В этой статье мы разберем практические примеры использования массивов в Swift, покажем, как эффективно применять методы map, filter, reduce и другие для решения реальных задач в iOS-разработке.


Практические примеры из iOS разработки

Работа с таблицами и коллекциями

Использование массивов для представления данных в таблицах и коллекциях.

import UIKit

// Модель данных
struct Item {
    let title: String
    let description: String
}

// Контроллер таблицы
class TableViewController: UITableViewController {
    // Массив элементов
    var items: [Item] = [
        Item(title: "Элемент 1", description: "Описание 1"),
        Item(title: "Элемент 2", description: "Описание 2"),
        Item(title: "Элемент 3", description: "Описание 3")
    ]

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
    }

    // Настройка количества строк
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }

    // Настройка содержимого ячеек
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        let item = items[indexPath.row]

        cell.textLabel?.text = item.title
        cell.detailTextLabel?.text = item.description

        return cell
    }

    // Обработка выбора строки
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let selectedItem = items[indexPath.row]
        print("Выбран элемент: \(selectedItem.title)")
    }
}

Управление данными в приложении

Пример использования массивов для хранения и управления данными в приложении.

import Foundation

// Модель данных для заметки
struct Note: Codable {
    let id: UUID
    var title: String
    var content: String
    let createdAt: Date
    var updatedAt: Date
}

// Сервис для работы с заметками
class NoteService {
    private let userDefaults = UserDefaults.standard
    private let notesKey = "notes"

    private(set) var notes: [Note] = []

    init() {
        loadNotes()
    }

    // Загрузка заметок из хранилища
    private func loadNotes() {
        if let data = userDefaults.data(forKey: notesKey),
           let storedNotes = try? JSONDecoder().decode([Note].self, from: data) {
            notes = storedNotes
        }
    }

    // Сохранение заметок в хранилище
    private func saveNotes() {
        if let encodedNotes = try? JSONEncoder().encode(notes) {
            userDefaults.set(encodedNotes, forKey: notesKey)
        }
    }

    // Создание новой заметки
    func createNote(title: String, content: String) -> Note {
        let now = Date()
        let note = Note(
            id: UUID(),
            title: title,
            content: content,
            createdAt: now,
            updatedAt: now
        )

        notes.append(note)
        saveNotes()

        return note
    }

    // Обновление существующей заметки
    func updateNote(id: UUID, title: String, content: String) -> Bool {
        if let index = notes.firstIndex(where: { $0.id == id }) {
            var note = notes[index]
            note.title = title
            note.content = content
            note.updatedAt = Date()

            notes[index] = note
            saveNotes()

            return true
        }

        return false
    }

    // Удаление заметки
    func deleteNote(id: UUID) -> Bool {
        if let index = notes.firstIndex(where: { $0.id == id }) {
            notes.remove(at: index)
            saveNotes()

            return true
        }

        return false
    }

    // Поиск заметок
    func searchNotes(query: String) -> [Note] {
        guard !query.isEmpty else {
            return notes
        }

        let lowercasedQuery = query.lowercased()

        return notes.filter {
            $0.title.lowercased().contains(lowercasedQuery) ||
            $0.content.lowercased().contains(lowercasedQuery)
        }
    }
}

Дополнительные материалы

Также читайте:  Язык Swift часть 10. Как написать цикл?