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

Я пытаюсь вызвать код Objective-C из Swift. Я создал заголовок Swift Bridging и добавил импорт в файл Objective-C (например, #import "UIColor+Utils.h").

Проект строится, и я даже получаю завершение кода, но когда он пытается выполнить эту строку кода, он падает и говорит unrecognized selector sent to class,

Что я сделал не так?

(Xcode 6.2, iOS 8.2)

2 ответа

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

Чтобы это исправить, убедитесь, что файл является членом той же цели, что и тот, который запущен в данный момент.

Например, если вы пытаетесь вызвать код Objective-C (например, UIColor+Utils.m) из вашего расширения WatchKit, затем файл.m (например, UIColor+Utils.m) должен иметь расширение WatchKit в разделе " Целевое членство ".

Для получения дополнительной информации см. Ниже.


Если вы включите.h файл в Bridging-Header.h файл, но не забудьте добавить файл к цели, вы получите следующее поведение.

Если вы пытаетесь вызвать метод в своем собственном классе (например, ABCClass.doSomething()):

  • Вы получите завершение кода.
  • Вы получите ошибку сборки: Undefined symbols for architecture x86_64,

Если вы пытаетесь вызвать метод расширения класса (например, UIColor.doSomething()):

  • Вы получите завершение кода.
  • Вы НЕ получите никаких ошибок / предупреждений при сборке.
  • При попытке выполнить эту строку вы получите сбой: unrecognized selector sent to class,

В xCode 8 при добавлении файла убедитесь, что вы выбрали правильную цель из "параметров". Я выбирал папку и добавлял ее непосредственно в свой проект, но почему-то это не устанавливало правильную цель.

Другие вопросы по тегам