Я пытаюсь найти способ назвать параметры типа функции для моего случая. Чтобы было понятнее, позвольте мне поделиться небольшим количеством кода.
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
.
Наконец, я знаю, что могу использовать делегирование. Но у него есть свои проблемы, на мой взгляд. Я уже пытался уменьшить Delegate
s в проекте, так как начал бороться с именами протоколов.
Заранее спасибо.
Каким было ваше решение тогда? Если вы можете поделиться, конечно @matt
Вы действительно ничего не можете с этим поделать. Если вы посмотрите на собственный код Apple, он страдает от той же проблемы. Они могут объявить typealias вроде developer.apple.com/documentation/uikit/…, но если вы хотите знать, что означают параметры, нет ярлыков, которые могли бы вам сказать; надо читать документацию.
Swift не разрешает именованные параметры в объявлении функции, поэтому вы можете сделать следующее:
class TestView: UIView {
// var action: () -> () = {}
var action: (_ name: String , _ surname: String ) -> () = { _, _ in }
@objc func buttonAction(_ sender: UIButton) {
action("name", "surname")
}
}
К сожалению, не решает проблему для стороны Controller
.
Не могу сказать, что понял, что вы имеете в виду.
Извините, я неправильно понял. Однажды я изменил action()
в Controller
на actioon(username: String?, password:String?)
, и, конечно, с вашим предложением выше это работает. Однако проблема здесь в том, что когда некоторые читают action("name", "surname")
как строку, есть вероятность, что они не смогут определить, что есть что. (как если бы не было индикации вроде namefield.text
). Я думаю, в большинстве случаев это было бы хорошо, и я могу слишком много думать.
Я нашел решение, и оно создает struct
с соответствующими var
в нем. И передать его Controller
.
Да, мы были вверх и вниз по этой дороге. По техническим причинам вы не можете использовать метки параметров в типе функции. Некоторое время это было возможно, IIRC, но затем Вселенная начала разрушаться.