Swift — Именование параметров типа функции

Я пытаюсь найти способ назвать параметры типа функции для моего случая. Чтобы было понятнее, позвольте мне поделиться небольшим количеством кода.

class ViewController: UIViewController {
    
    private lazy var testView: TestView = {
        let view = TestView()
        view.action = action
        return view
    }()
    
    func action() {
        //stuff
    }
    
}

class TestView: UIView {
    
    var action: () -> () = {}
    
    @objc func buttonAction(_ sender: UIButton) {
        action()
    }
}

Код выше работает хорошо, вводя UIButton действия из View в Controller, но становится хуже, когда есть параметры, которые нужно передать. Когда я пытаюсь изменить action внутри TestView на,

var action: (name: String, surname: String) -> () = { _, _ in }

это не позволяет мне называть String параметры. Впоследствии я попытался изменить его с помощью кортежа,

var action: ((name: String, surname: String)) -> () = { _ in }

код внутри TestView работает. Однако я не могу сопоставить типы view.action = action в ViewController.

Я пытаюсь это сделать по двум причинам. Один из них заключается в том, чтобы не иметь какой-либо логики внутри View, а другой - легко идентифицировать и избежать путаницы параметров внутри ViewController по его имени, когда есть 2+ параметра, которые будут отправлены в Controller.

Наконец, я знаю, что могу использовать делегирование. Но у него есть свои проблемы, на мой взгляд. Я уже пытался уменьшить Delegates в проекте, так как начал бороться с именами протоколов.

Заранее спасибо.

Да, мы были вверх и вниз по этой дороге. По техническим причинам вы не можете использовать метки параметров в типе функции. Некоторое время это было возможно, IIRC, но затем Вселенная начала разрушаться.

matt 11.12.2020 22:46

Каким было ваше решение тогда? Если вы можете поделиться, конечно @matt

Faruk 11.12.2020 22:48

Вы действительно ничего не можете с этим поделать. Если вы посмотрите на собственный код Apple, он страдает от той же проблемы. Они могут объявить typealias вроде developer.apple.com/documentation/uikit/…, но если вы хотите знать, что означают параметры, нет ярлыков, которые могли бы вам сказать; надо читать документацию.

matt 12.12.2020 00:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Swift не разрешает именованные параметры в объявлении функции, поэтому вы можете сделать следующее:

class TestView: UIView {
    
//    var action: () -> () = {}
    var action: (_ name: String , _ surname: String ) -> () = { _, _ in }
    
    @objc func buttonAction(_ sender: UIButton) {
        action("name", "surname")
    }
}

К сожалению, не решает проблему для стороны Controller.

Faruk 12.12.2020 15:31

Не могу сказать, что понял, что вы имеете в виду.

Asperi 12.12.2020 15:37

Извините, я неправильно понял. Однажды я изменил action() в Controller на actioon(username: String?, password:String?), и, конечно, с вашим предложением выше это работает. Однако проблема здесь в том, что когда некоторые читают action("name", "surname") как строку, есть вероятность, что они не смогут определить, что есть что. (как если бы не было индикации вроде namefield.text). Я думаю, в большинстве случаев это было бы хорошо, и я могу слишком много думать.

Faruk 12.12.2020 20:21

Я нашел решение, и оно создает struct с соответствующими var в нем. И передать его Controller.

Faruk 12.12.2020 20:23

Другие вопросы по теме