Почему Swift позволяет мне вызывать setTitle на AnyObject?

@IBAction func helloClick(sender: AnyObject) {

    sender.setTitle("Click", forState: UIControlState.Normal)

}

приведенный выше код работает нормально. Но!--1--> Не метод AnyObject? Разве это не ошибка времени компиляции?

2 ответов


Это часть спецификации языка (см. раздел на совместимость id)

вы также можете вызвать любой метод Objective-C и получить доступ к любому свойству (на AnyObject) без приведения к более определенному типу класса.

Это позволяет упростить взаимодействие Objective-C.

в руководстве также говорится следующее:

однако, поскольку конкретный тип объекта, типизированного как AnyObject, не известен до времени выполнения можно непреднамеренно писать небезопасный код.

очевидно, как срок действия вашего кода определяется только во время выполнения, это может быть небезопасно.


AnyObject ведет себя аналогично Objective-C's id

Он позволяет вызывать любой метод. Цель AnyObject is для обхода ошибок времени компиляции. Вы можете вызвать любой метод на AnyObject и он будет компилироваться нормально. Вы увидите только ошибки в runtime.

согласно документам,

вы также можете вызвать любой метод Objective-C и получить доступ к любому свойству (на AnyObject) без приведения к более определенному классу тип.