簡體   English   中英

React-native 橋接與 Swift 單例自定義類

[英]React-native bridging with Swift singleton custom class

今天,我嘗試在我的 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-native 應用程序的模塊:

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

當我刪除導出模塊時錯誤消失。 我真的不明白錯誤是什么意思......

如果有人有想法,將不勝感激:)

問題在於 React Native 橋接機制。 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)
  }
}

來源參考: https : //gist.github.com/harveyconnor/7b0e778effaae302f512485c18881569

您正在繼承 NSObject,因此您必須提供公共 init 構造函數,它將初始化您的tracker屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM