#swift #delegation
#swift #делегирование
Вопрос:
Я использую делегирование и использую один и тот же класс двумя разными способами.
protocol ColorSwitchDelegate {
func colorSwitched(picker: ColorSwitch, color: ColorChoice)
}
class ColorSwitch: UIView {
var delegate: ColorSwitchDelegate?
func doSomething() {
delegate?.colorSwitched(picker: self, color: color)
}
}
class SettingsViewController: UIViewController, ColorSwitchDelegate {
@IBOutlet weak var myView1: ColorSwitch!
@IBOutlet weak var myView2: ColorSwitch!
func viewWillAppear(_ animated: Bool) {
myView1.delegate = self
myView2.delegate = self
}
func colorSwitched(picker: ColorSwitch, color: ColorChoice) {
// I want to find out if myView1 or myView2 is the delegating object
}
}
Я хочу определить, какое представление (myView1 или myView2) является делегатором. Я мог бы добавить тег в класс ColorSwitch, но это кажется неэлегантным. Есть ли лучший способ?
Комментарии:
1. вы можете проверить, является ли picker == self.myView1 { } . но я думаю, что добавление тега является лучшим.
2. Извините, я уточнил свой код. Как для myView1, так и для myView2 для делегата установлен параметр SettingsViewController. Поэтому я не могу проверить значение nil.
3.
if picker === myView1 { // do something with 1 } else if picker === myView2 { // do something with 2 }
4. Потрясающе, оба ваших решения работают, спасибо!
Ответ №1:
Вы можете напрямую проверить, colorSwitched
используя identity opeartor === который проверяет, ссылаются ли две ссылки на объекты на один и тот же экземпляр объекта.
func colorSwitched(picker: ColorSwitch, color: ColorChoice) {
if picker === self.myView1 {
//myView1
} else {
//myView2
}
}