Подтвердить что ты не робот

.dynamicType устарел. Вместо этого используйте 'type (of...)'

Я только что обновился до Xcode 8 и iOS 10 (используя устаревшую версию языка Swift).

Попытка снова скомпилировать мой проект была агонией, даже при использовании старого синтаксиса Swift. На этот раз одна из моих функций использует NSBundle(forClass: self.dynamicType), но теперь кажется, что .dynamicType устарел, а Xcode даже не хочет его компилировать.

Его предложение состоит в том, чтобы использовать type(of: self), но это не удается. Кто-нибудь знает решение? Спасибо.

4b9b3361

Ответ 1

@dfri отвечает отлично для Swift 3.

Что касается Swift 2.3, моим решением было очистить Xcode (Command + Option + Shift + K) и удалить все в ~/Library/Developer/Xcode/DerivedData. Проблема не исчезает мгновенно, но через некоторое время она перестанет выдавать эту ошибку.

Может быть, это ошибка, ведь мы в 8.0. Я надеюсь, что он будет исправлен в следующих выпусках.

Спасибо всем.

Ответ 2

(Ниже приведено значение для Swift 3, но не прежняя версия языка Swift (2.3), поэтому он не отвечает на вопрос OP, но может быть полезен для пользователей Swift 3, тем не менее)

Как уже отмечалось в вашем вопросе, dynamicType теперь (Swift 3) устарел в пользу type(of:). Кроме того:

  • NSBundle был переименован в Bundle.
  • Инициализатор init(forClass:) Bundle был переименован в init(for:).

Принимая во внимание эти изменения, для Swift 3 вы инициализируете (или выбираете существующий экземпляр, связанный с определенным классом) ваш объект Bundle следующим образом:

class Foo {
    func bar() -> () {
        let bundle = Bundle(for: type(of: self))
        // ...
    }
}