2016-09-14 5 views
30

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

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

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

+1

'NSBundle (forClass: self.dynamicType)' компилирует отлично для меня в Swift 2.3, вы уверены, что «Использовать устаревшую версию языка Swift» установлено в «Да»? Вы всегда можете попробовать очистить папку сборки. – Hamish

+0

Да, он установлен, и я вижу эффект, потому что число синтаксических ошибок уменьшается с 30 до 1. Мое мнение таково, что эта ошибка связана с новой картой UIKit, обновленной в новом SDK для iOS 10, поэтому, когда я обновлялся до Xcode 8, похоже, даже активировал старый синтаксис Swift. – Rodrigo

+0

Ничего, мой последний оператор, UIKit все тот же – Rodrigo

ответ

1

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

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

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

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

+0

@sgonzalez Его ответ работает на Swift 3. Я использовал старый Swift (2). – Rodrigo

30

(В приведенной ниже справедливо для 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)) 
     // ... 
    } 
} 
+1

OP использует устаревшую версию Swift, а также Swift 2.3 - так что AFAIK его текущий код должен быть действительным – Hamish

+0

@Hamish О, я просто прочитал _ «Xcode 8 и iOS 10» _ xD спасибо! – dfri

+0

Без проблем, я думал, что на первый взгляд! – Hamish