Сегодня я пытаюсь использовать свой пользовательский класс Swift, реализующий шаблон Singleton, в моем коде Javascript. Я уже создал собственные модули, но сегодня я получил эту ошибку: "Неустранимая ошибка: использование нереализованного инициализатора init() для класса"
Я думаю, это потому, что шаблон Singleton, но я не могу понять свою ошибку...
Вот мой код:
AnalyticsTracker.swift
import Foundation
import Tracker
@objc(AnalyticsTracker)
class AnalyticsTracker: NSObject {
static let shared = AnalyticsTracker(tracker: ATInternet.sharedInstance.defaultTracker)
// MARK: -
let tracker: Tracker
// Initialization
private init(tracker: Tracker) {
self.tracker = tracker
}
@objc
func viewScreen(screen: String) {
self.tracker.screens.add(screen).sendView()
}
@objc
func sendTouch(clickName: String, chapter1: String, chapter2: String, chapter3: String, level2: Int) {
let gesture = self.tracker.gestures.add(clickName, chapter1: chapter1, chapter2: chapter2, chapter3:chapter3)
gesture.level2 = level2
gesture.sendTouch()
}
}
И модуль для экспорта моего класса в мое реактивное приложение:
AnalyticsTracker.m
#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
@interface RCT_EXTERN_MODULE(AnalyticsTracker, NSObject)
RCT_EXTERN_METHOD(
sendTouch:
(NSString*)clickName
(NSString*)chapter1
(NSString*)chapter2
(NSString*)chapter3
(int)level2
)
@end
Ошибка исчезает, когда я удаляю модуль экспорта. Я действительно не понимаю, что означает ошибка...
Если у кого-то есть идея, это будет очень признательно :)





вы наследуете NSObject, поэтому вы должны предоставить общедоступный конструктор инициализации, который инициализирует ваше свойство tracker.
@MihirMehta, ты абсолютно прав. Извините за вводящий в заблуждение ответ, я добавлю еще один, который, надеюсь, будет вам полезен.
Проблема заключается в механике соединения React Native. Насколько я знаю, он не поддерживает пользовательскую инициализацию. В качестве обходного пути вы можете создать вспомогательный класс, который будет использовать AnalyticsTracker.shared в своих экспортируемых методах:
// RNAnalyticsTracker.swift
import Foundation
@objc(RNAnalyticsTracker)
class RNAnalyticsTracker: NSObject {
@objc
func viewScreen(screen: String) {
AnalyticsTracker.shared.viewScreen(screen: screen)
}
@objc
func sendTouch(clickName: String, chapter1: String, chapter2: String, chapter3: String, level2: Int) {
AnalyticsTracker.shared.sendTouch(clickName: clickName, chapter1: chapter1, chapter2: chapter2, chapter3: chapter3, level2: level2)
}
}
Ссылка на источник: https://gist.github.com/harveyconnor/7b0e778effaae302f512485c18881569
Спасибо ... Это, кажется, единственный путь вперед ... Не могли бы вы также сказать мне, как передать обратный вызов из Swift в reactNative? Мой код Swift находится в отдельной частной структуре Cocoapods, поэтому функция внутри swift не может принимать RCTResponseSenderBlock в качестве аргумента... Это единственная недостающая головоломка сейчас... Спасибо за вашу помощь
@MihirMehta Вы можете добиться этого, используя ту же технику. Просто создайте вспомогательный класс с методами @objc, взяв в качестве параметра RCTResponseSenderBlock. И перенаправляйте вызовы на ваш библиотечный класс.
Спасибо, RCTResponseSenderBlock нельзя добавить в качестве параметра, поскольку Cocoapods SDK — это чистая библиотека Swift, которую я создаю.
Вы нашли решение?