2

私は Couchbase と Swift のまったくの初心者であり、現在取り組んでいる新しいアプリの候補アーキテクチャを立ち上げて実行しようとしています。クラッシュせずに動作させることができないという事実を除けば、Couchbase はぴったりだと思います。これにはいくつかの理由があるかもしれませんが、健全性をチェックするために、それが間違っているかどうかを知りたかっただけです。

次のマッピング関数では、emit 関数が呼び出されるたびに EXC_BAD_ACCESS エラーが発生します。関数は、起動時にView Controllerから呼び出されています。デバッガーでパラメーターを確認しましたが、それらはメモリ内の有効な参照を指しています。クエリを作成する関数は次のとおりです。

  class func listEvents() -> CBLQuery? {
    if let view:CBLView = DatabaseService.sharedInstance.database.viewNamed("events") {
      if !view.mapBlock { //create the map block if it doesn't exist
        func mapBlock(doc: [NSObject: AnyObject]!, emit: ((key: AnyObject, value: AnyObject!) -> ())?) {
          if let type:AnyObject = doc["type"] {
            if type.isKindOfClass(NSString.self) && (type as String) == Event.docType() {
              if let key: AnyObject = doc["date"] {
                if let emitFunc = emit {
                  emitFunc(key: key, value: doc)
                }
              }
            }
          }
        }
        view.setMapBlock(mapBlock,
          reduceBlock: nil,
          version: "1")
      }
      return view.createQuery()
    }
    return nil
  }

また、Objective-C で関数全体を書き直そうとしましたが、うまくいきました。誰も助けてくれない場合は、これを Swift のバグに置きます。もしそうなら、Apple に問題を報告したいのですが、Couchbase Mobile SDK と Swift がどのように機能するかについての私の理解はまだかなり限られています。Couchbase Lite を Swift で動作させることに成功した人がいる場合は、私を助けていただければ幸いです。または、Github に Swift で記述されたサンプル プロジェクトがあれば、現時点ではそれが私の宝です。

4

2 に答える 2

1

Couchbase と Swiftのチートシートを指摘してくれた @gigq のおかげで、エラーを突き止めることができました。内部関数を使用する代わりに、機能しているように見えるクロージャー変数を使用しました。Swift がクロージャではなく関数内の変数をキャプチャする方法と関係があると思われますが、100% 確実ではありません。

誰かがそれを必要としている、または興味を持っている場合、これは作業コードです:

class func listEvents() -> CBLQuery? {
    var view = DatabaseService.sharedInstance.database.viewNamed("events")

    if !view.mapBlock {
      var mapBlock: CBLMapBlock = { (doc: [NSObject: AnyObject]!, emit: CBLMapEmitBlock!) in
        if let type:AnyObject = doc["type"] {
          if type.isKindOfClass(NSString.self) && (type as String) == Event.docType() {
            emit(doc["date"], doc)
          }
        }
      }
      view.setMapBlock(mapBlock, version: "1")
    }
    return view.createQuery()
  }
于 2014-07-26T09:55:31.633 に答える