Нераспознанный селектор, отправленный экземпляру при попытке вызвать метод расширения через быстрый заголовок моста
Я пытаюсь вызвать код 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 при добавлении файла убедитесь, что вы выбрали правильную цель из "параметров". Я выбирал папку и добавлял ее непосредственно в свой проект, но почему-то это не устанавливало правильную цель.