Рассмотрим следующий код:расширение Swift протокол, уведомляет наблюдатель
protocol A {
func doA()
}
extension A {
func registerForNotification() {
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardDidShow:"), name: UIKeyboardDidShowNotification, object: nil)
}
func keyboardDidShow(notification: NSNotification) {
}
}
Теперь рассмотрим подкласс UIViewController, который реализует:
class AController: UIViewController, A {
override func viewDidLoad() {
super.viewDidLoad()
self.registerForNotification()
triggerKeyboard()
}
func triggerKeyboard() {
// Some code that make key board appear
}
func doA() {
}
}
Но удивительно это рушится с ошибкой:
keyboardDidShow:]: unrecognized selector sent to instance 0x7fc97adc3c60
Должен ли я реализовать наблюдателя в самом контроллере представления? Не может ли он остаться в продлении?
Следующие вещи уже пробовали.
Создание протокола класса. Добавление клавиатурыDidShow к самому протоколу в качестве подписи.
protocol A:class {
func doA()
func keyboardDidShow(notification: NSNotification)
}
Я пытался что-то подобное тоже в прошлом, но я обнаружил, что расширения протокола Свифта не работают с протоколами Objective-C и классы [но, по-видимому, они как-то делают] (http://stackoverflow.com/questions/27097688/can-objective-c-code-call-swift-extension-on-class), я смущен – Kametrixom
'extension A { } '??? Вы говорите о 'extension Controller {}' –
Вам просто нужно добавить параметр к методу или удалить: с конца имени селектора –