Какой у вас опыт работы с UIKit?

Ответ

Да, есть опыт разработки на UIKit.

Основные компетенции:

  • Компоненты: Работа с UIViewController, UIView, UITableView, UICollectionView, UILabel, UIButton и другими.
  • Жизненный цикл: Понимание и обработка событий жизненного цикла UIViewController (viewDidLoad, viewWillAppear и т.д.).
  • Автолейаут: Верстка интерфейсов с использованием NSLayoutConstraint, UIStackView и фреймов.
  • Протоколы и делегаты: Реализация UITableViewDataSource, UITableViewDelegate, UICollectionViewDelegateFlowLayout и пользовательских делегатов.
  • Анимации: Использование UIView.animate(withDuration:) и Core Animation.

Пример кода (UITableView с кастомной ячейкой):

class ItemsViewController: UIViewController {
    private let tableView = UITableView()
    private var items = ["Элемент 1", "Элемент 2", "Элемент 3"]

    override func viewDidLoad() {
        super.viewDidLoad()
        setupTableView()
    }

    private func setupTableView() {
        view.addSubview(tableView)
        tableView.frame = view.bounds
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
        tableView.dataSource = self
    }
}

extension ItemsViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.text = items[indexPath.row]
        return cell
    }
}

Почему UIKit? Это зрелый, императивный фреймворк, предоставляющий полный контроль над интерфейсом и жизненным циклом, что критически важно для поддержки legacy-кода и сложных, высоконагруженных экранов.

Ответ 18+ 🔞

А, UIKit, говоришь? Да, конечно, есть, блядь, опыт. Это ж как старый, проверенный друг, который может и в рыло дать, если неправильно с ним обращаться.

Что я там понаделал, епта:

  • Вся эта хрень: UIViewController, UIView, UITableView, UICollectionView — с ними на короткой ноге. Кнопки, лейблы — да хули там, обычное дело.
  • Жизненный цикл: О, это святое, блядь. Знаю, когда viewDidLoad приходит, а когда viewWillAppear нагрянет. Не попасть бы в просак, когда вьюха уже на экране, а данные ещё нихуя не пришли.
  • Автолейаут: Верстал и констрейнтами (NSLayoutConstraint), и UIStackView — эта штука, блядь, иногда жизнь упрощает, а иногда такую дичь творит, что волосы дыбом. И да, старым-добрым фреймам тоже место знаю.
  • Делегаты с протоколами: UITableViewDataSource, UITableViewDelegate — это как два полушария одного мозга, блядь. Без одного второе — просто кусок мяса. Кастомные делегаты тоже пилил, когда нужно было пообщаться между контроллерами.
  • Анимации: Ну, UIView.animate(withDuration:) — это как базовый камасутра. Иногда, конечно, приходилось лезть в Core Animation, когда нужно было что-то поизвращенней.

Вот, смотри, кусок кода, чтоб не на словах (таблица с ячейками):

class ItemsViewController: UIViewController {
    private let tableView = UITableView()
    private var items = ["Элемент 1", "Элемент 2", "Элемент 3"]

    override func viewDidLoad() {
        super.viewDidLoad()
        setupTableView()
    }

    private func setupTableView() {
        view.addSubview(tableView)
        tableView.frame = view.bounds
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
        tableView.dataSource = self
    }
}

extension ItemsViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.text = items[indexPath.row]
        return cell
    }
}

А почему UIKit, спрашиваешь? Да потому что это, блядь, фундамент. Фреймворк, который не прячет от тебя ни хуя. Хочешь контролировать каждый пиксель, каждый чих жизненного цикла, особенно когда ворочаешь legacy-кодом, который видел виды, или делаешь экран, где анимаций и данных — овердохуища? Тут без полного контроля — просто пиздец. SwiftUI — это, конечно, красиво и модно, но когда нужно залезть в самую жопу и всё сделать по-своему, старина UIKit не подводит.