«Свойство не найдено в объекте типа» при создании Objective C для Swift Bridge

Я получаю сообщение об ошибке: свойство «clientChatLoad» не найдено в объекте типа «DataManager» при использовании следующей реализации:

AppDelegate.m

 #import "IOS_Project_Name-Swift.h"

@class DataManager;

...

    DataManager.clientChatLoad(0){ data, error in
        guard data != nil else {
            print(error)
            return
        }

        guard let data = data else { return }
        let json = JSON(data: data)

        if let result = json["success"].bool{
            if (result){

                dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.5 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { () -> Void in
                    NSNotificationCenter.defaultCenter().postNotificationName("refreshChatDetails", object: nil, userInfo:nil)
                }
            }

        }

DataManager.swift

    ...

   @objc class func clientChatLoad(_ chatId: Int, completionHandler: @escaping (Data?, NSError?) -> ()) -> URLSessionTask {
        // AJ TO-DO
        var defaults = UserDefaults.standard
        let URL = Foundation.URL(string: chatUrl)!
        var request = URLRequest(url: URL, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 3.0)
        request.httpMethod = "POST"

    ...

Насколько я понимаю, добавление @class DataManager в мой класс Objective C, а также @objc перед class func clientChatLoad должно отображать код Swift в моем классе Objective C... но я все равно получаю сообщение об ошибке. Что я мог упустить из виду?


person Droidthusiast    schedule 09.03.2017    source источник
comment
Ваш код не имеет смысла. Ваш код AppDelegate.m должен быть на Objective-C, но он на Swift.   -  person matt    schedule 09.03.2017
comment
Содержит ли ваш файл .m Objective-C #import сгенерированный соединительный заголовок -Swift.h?   -  person matt    schedule 09.03.2017
comment
Да. (Я обновил фрагмент кода, чтобы отразить это.)   -  person Droidthusiast    schedule 09.03.2017
comment
Тем не менее, это не имеет смысла, поскольку ваш вызов DataManager.clientChatLoad находится в Swift, а не в Objective-C. И в любом случае файл .m Objective-C никогда не должен содержать объявление @class. Пожалуйста, постарайтесь показать свой реальный код.   -  person matt    schedule 09.03.2017
comment
Как я могу сделать это в задаче C? Глядя на другие примеры кода, кажется, что мне нужно сделать что-то вроде: DataManager *dataMan = [DataManager new]; [dataMan clientChatLoad]; однако результатом является ошибка: Receiver 'DataManager' для сообщения класса является предварительным объявлением   -  person Droidthusiast    schedule 09.03.2017
comment
Я не знаю, что вы имеете в виду, делая это. Вы до сих пор не показали нам, что ваш код на самом деле вызывает ошибку! Я имею в виду, вы не можете на самом деле пытаться поместить код Swift в файл AppDelegate.m Objective-C — не так ли???   -  person matt    schedule 09.03.2017
comment
И я уже говорил вам, вам нужно удалить эту строку @class.   -  person matt    schedule 09.03.2017
comment
Я только что опубликовал фрагмент кода Objective C в своем последнем комментарии и ошибку, которую он вызвал... (Я заменил свой вызов Swift на clientChatLoad этой реализацией Objective C [извините, если это исходит от Noobville... Я обычно Android /Java-разработчику и мне недавно было поручено внести некоторые изменения в этот проект... просто пытаюсь пройти через него]).   -  person Droidthusiast    schedule 09.03.2017
comment
И я сказал вам, что делать с ошибкой. Но комментарии — не место для обсуждения кода. Вы должны исправить свой вопрос, чтобы он касался кода Objective-C.   -  person matt    schedule 09.03.2017


Ответы (2)


Сначала я подумал, что ваш код — просто какая-то опечатка, но в ходе обсуждения в комментариях я понял, что это реально и что вы пытаетесь поместить код Swift в файл Objective-C< /em> (а именно AppDelegate.m). Ты не можешь сделать это! Файл Objective-C должен быть полностью написан на Objective-C!

Я бы сомневался, действительно ли вам нужно гибридное приложение (приложение, написанное на двух языках). Ваша жизнь станет намного проще, если вы выберете всего один язык и напишете на нем все приложение. Но если вы собираетесь создать гибридное приложение, вам необходимо изучить Objective-C и написать Objective-C в Objective-C.

person matt    schedule 09.03.2017
comment
Спасибо за разъяснение - я сделаю два шага назад, переосмыслю подход и вернусь с лучшей реализацией. Очень признателен. - Полный iOS noob. - person Droidthusiast; 09.03.2017

убедитесь, что ваш класс DataManager наследуется от NSObject. Вы должны быть хорошими.

person Priyatham51    schedule 09.03.2017
comment
Извиняюсь (я новичок в обоих языках), это будет что-то вроде: class func clientChatLoad(_ chatId: NSObject, Int, completeHandler: @escaping (Data?, NSError?) -> ()) -> URLSessionTask { - person Droidthusiast; 09.03.2017