Ios 使用Swift singleton自定义类响应本机桥接

Ios 使用Swift singleton自定义类响应本机桥接,ios,objective-c,swift,react-native,Ios,Objective C,Swift,React Native,今天,我尝试在Javascript代码中使用自定义Swift类实现单例模式。我已经创建了本机模块,但今天出现了以下错误:“致命错误:对类使用未实现的初始值设定项'init()”” 我想这是因为单身模式,但我不能理解我的错误 这是我的密码: AnalyticsTracker.swift import Foundation import Tracker @objc(AnalyticsTracker) class AnalyticsTracker: NSObject { static l

今天,我尝试在Javascript代码中使用自定义Swift类实现单例模式。我已经创建了本机模块,但今天出现了以下错误:“致命错误:对类使用未实现的初始值设定项'init()”

我想这是因为单身模式,但我不能理解我的错误

这是我的密码:

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()
  }
}
以及将类导出到react本机应用程序的模块:

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
AnalyticsTracker.m
#进口
#进口
@接口RCT\u外部模块(AnalyticsTracker,NSObject)
RCT\u外部方法(
sendTouch:
(NSString*)单击名称
(NSString*)第1章
(NSString*)第2章
(NSString*)第3章
(内部)2级
)
@结束
当我删除导出模块时,错误消失。我真的不明白这个错误是什么意思


如果有人有想法,我们将非常感激:)

您正在继承NSObject,因此您必须提供公共init构造函数,它将初始化您的
跟踪器
属性。

问题在于React本机桥接机制。AFAIK不支持自定义初始化。作为一种解决方法,您可以创建一个助手类,该类将在其导出的方法中使用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)
  }
}

参考资料来源:

你找到解决方案了吗?@MihirMehta,你完全正确。很抱歉误导了你的答案,我会再加上一个,希望对你有用。谢谢你。。。这似乎是唯一的出路。。。您能告诉我如何将Swift的回调传递给reactNative吗?我的Swift代码在单独的cocoapods私有框架中,因此Swift中的函数不能将RCTResponseSenderBlock作为参数。。。这是现在唯一缺失的谜题。。。谢谢你的支持help@MihirMehta您可以使用相同的技术实现这一点。只需使用
@objc
方法创建一个helper类,并将RCTResponseSenderBlock作为参数。并将调用重定向到你的库类。谢谢你,RCTresResponseSenderBlock不能作为参数添加,因为Cocoapods SDK是我正在构建的纯Swift库