iOS – не удается получить доступ к Swift Singleton из Objective-C

Я не могу получить доступ к моему классу Swift Singleton из моего Objective-C ViewController.

Xcode распознает мой класс Swift, он строится, поэтому я не думаю, что это проблема с заголовком моста.

Вот мой класс Swift Singleton:

@objc class MySingleton : NSObject {

    static let shared = MySingleton()

    private override init() {}
}

А затем в моем файле .m я импортирую этот заголовок:

#import "myProject-Swift.h"

И используйте Singleton следующим образом:

 MySingleton *testSingleton = [MySingleton shared];

или таким образом:

[MySingleton shared];

Он распознает тип класса MySingleton, но я не могу получить доступ ни к каким функциям или свойствам этого класса.

Что мне не хватает? Все подобные посты не помогли.

EDIT: я сделал тестовую функцию

func testPrint() {
   print("Singleton worked")
}

И назвал это так в файле Objective-C:

[[MySingleton shared] testPrint];

Неизвестный экземпляр для селектора «testPrint»


person Community    schedule 26.10.2017    source источник
comment
MySingleton *testSingleton = [общий MySingleton]; используя это, вы собираетесь создать еще один экземпляр, в то время как у вас уже был синглтон. я думаю, вы можете напрямую получить доступ к любым методам или свойствам следующим образом: [[MySingleton shared] anyMethod];   -  person Er.Gopal Vasani    schedule 26.10.2017
comment
Я отредактировал свой вопрос с примером   -  person    schedule 26.10.2017
comment
@GOPALVASANI, вы не правы, это основной способ создания синглтона в Swift.   -  person Luzo    schedule 26.10.2017
comment
@ Лузо. что не так с моим предложением? я имею в виду, что разработчик уже поделился экземпляром, тогда зачем создавать еще один?   -  person Er.Gopal Vasani    schedule 26.10.2017
comment
@Balanced, не могли бы вы предоставить мне проверенный код.   -  person Er.Gopal Vasani    schedule 26.10.2017
comment
Сравните stackoverflow.com/q/44390378/2976878   -  person Hamish    schedule 26.10.2017
comment
Отличные вещи @ Хэмиш. Хорошо знать об этом. Обязательно пригодится на будущее.   -  person    schedule 26.10.2017


Ответы (3)


В вашем классе Swift Singleton добавьте @objc для метода testPrint(), например:

@objc func testPrint() {
   print("Singleton worked")
}

Теперь вы получаете доступ к методу из класса Objective-C:

[[MySingleton shared] testPrint];
person Imad Ali    schedule 26.10.2017
comment
Хорошо, ты прав. Но мне также пришлось добавить @objc в общее свойство. Кажется странным. Я думал, что сделать это для всего класса будет достаточно. - person ; 26.10.2017

используйте атрибут @objc перед функцией testPrint(). см. документацию

Чтобы быть доступным и пригодным для использования в Objective-C, класс Swift должен быть потомком класса Objective-C или должен быть помечен @objc.

person Suhit Patil    schedule 26.10.2017

Вам нужно добавить @objc к любому свойству или функции, которую вы хотите предоставить для Objective-C, включая статическое общее свойство:

class MySingleton : NSObject {

    @objc static let shared = MySingleton()
    private override init() { }
    @objc func testPrint() { print("Singleton worked") }

}

Затем вызов из файла Objective-C:

MySingleton *singleton = [MySingleton shared];
[singleton testPrint];

Обратите внимание, что пометка всего класса как @objc не заменяет вышеуказанное. На самом деле он больше не нужен, и достаточно наследоваться от NSObject.

person brkeyal    schedule 22.01.2020