Почему я не могу использовать мои файлы swift в моем коде Objective-C? - PullRequest
1 голос
/ 04 октября 2019

Я прочитал несколько учебных пособий по использованию swift classes в objective-c classes, и это кажется достаточно простым, но я все еще не могу заставить его работать.

У меня есть тесткласс для swift с именем UserDefaultsFactory.swift, содержащий это:

class UserDefaultFactory {
    func a() {
        print("?HELLO")
    }
}

И в моем objective-c class я импортировал проект name-swift так: #import "NetPBXMobile-Swift.h". Это работает без ошибок, и если я обращаюсь к файлу, я вижу, что он полон ссылок на классы swift. Но по какой-то причине в нем нет моего class UserDefaultsFactory.

Я очистил и собрал код, но все равно ничего. Насколько я понимаю, NetPBXMobile-Swift.h создается автоматически, так как я вижу, что он содержит мои собственные функции swift из других classes, которые я создал ранее.

Я попытался инициировать объект, подобный этому:

UserDefaultFactory a = [[UserDefaultFactory alloc] init];

Но я получаю сообщение об ошибке, что это необъявленный идентификатор.

Im 'Я использую правильный подход или есть другой способ сделать это?

Ответы [ 4 ]

2 голосов
/ 04 октября 2019

Чтобы уточнить ... Ваш класс должен быть помечен @objc и должен быть производным от NSObject, и ваш func также должен быть помечен @objc:

@objc class UserDefaultFactory: NSObject {
    @objc func a() {
        print("?HELLO")
    }
}

Чтобы затем вызвать эту функцию из кода Objective-C:

UserDefaultFactory *udf = [UserDefaultFactory new];
[udf a];

Вы могли бы также вызвать его через:

[[UserDefaultFactory new] a];

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

2 голосов
/ 04 октября 2019

Вам нужно пометить класс как доступный для Objective-c, добавив к нему префикс @objc

Попробуйте это

@objc class UserDefaultFactory: NSObject {
    func a() {
        print("?HELLO")
    }
} 
1 голос
/ 04 октября 2019

Убедитесь, что ваш класс Swift наследует от класса, производного (прямо или косвенно) от NSObject.

Если вы пометите свой класс Swift как @objc без какого-либо наследования, описанного выше, вы получите ошибку «Только»классы, которые наследуются от NSObject, могут быть объявлены @objc "

Отметив свой класс Swift как @objcMembers без какого-либо наследования - вы получите ошибку в части Obj-c" Неизвестное имя типа "

1 голос
/ 04 октября 2019

Добавить новый файл Swift в проект. В меню выберите «Файл»> «Создать»> «Файл»… затем выберите «Файл Swift» вместо «Какао-класс касания». Назовите файл и нажмите «Создать». Появится диалоговое окно, убедитесь, что выбрали «Create Bridging Header» при появлении запроса. Первый раз, когда вы добавляете файл swift в свой проект, это единственный раз, когда появится это приглашение. Прямой выбор заголовка моста избавит вас от необходимости создавать его вручную.

Далее, после выбора «Создать заголовок моста» или создания его вручную, перейдите к общим настройкам вашего проекта. Выберите правильную цель для вашего приложения. Перейдите в «Build Settings» и переключитесь на «All» вместо «Basic», которое используется по умолчанию. Здесь ищите раздел «Упаковка». Включите «Определение модуля», изменив «Нет» на «Да».

Ссылка: https://medium.com/ios-os-x-development/swift-and-objective-c-interoperability-2add8e6d6887

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...