Нативное соединение React с пользовательским классом Swift singleton

Сегодня я пытаюсь использовать свой пользовательский класс 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

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

Если у кого-то есть идея, это будет очень признательно :)

Вы нашли решение?

Mihir Mehta 18.07.2020 20:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
532
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

вы наследуете NSObject, поэтому вы должны предоставить общедоступный конструктор инициализации, который инициализирует ваше свойство tracker.

@MihirMehta, ты абсолютно прав. Извините за вводящий в заблуждение ответ, я добавлю еще один, который, надеюсь, будет вам полезен.

Dmitriy Kirakosyan 18.07.2020 23:54
Ответ принят как подходящий

Проблема заключается в механике соединения 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 в качестве аргумента... Это единственная недостающая головоломка сейчас... Спасибо за вашу помощь

Mihir Mehta 19.07.2020 06:20

@MihirMehta Вы можете добиться этого, используя ту же технику. Просто создайте вспомогательный класс с методами @objc, взяв в качестве параметра RCTResponseSenderBlock. И перенаправляйте вызовы на ваш библиотечный класс.

Dmitriy Kirakosyan 19.07.2020 10:45

Спасибо, RCTResponseSenderBlock нельзя добавить в качестве параметра, поскольку Cocoapods SDK — это чистая библиотека Swift, которую я создаю.

Mihir Mehta 19.07.2020 18:04

Другие вопросы по теме