web-dev-qa-db-ja.com

レルムでIntの配列を宣言するSwift

RLMObject内で整数の配列を宣言するにはどうすればよいですか?

お気に入り :

dynamic var key:[Int]?

次のエラーが発生します:

Terminating app due to uncaught exception 'RLMException', reason: ''NSArray' is not supported as an RLMObject property. All properties must be primitives, NSString, NSDate, NSData, RLMArray, or subclasses of RLMObject. See https://realm.io/docs/objc/latest/api/Classes/RLMObject.html for more information.'
20
Vinicius Albino

プリミティブのリストは、残念ながらまだサポートされていません。問題がある #112 そのためのサポートの追加を追跡する。現在、これを回避する方法がいくつかあります。

最も簡単な回避策は、int値を保持するオブジェクトを作成することです。次に、オブジェクトのリストを持つモデル。

class Foo: Object {
    let integerList = List<IntObject>() // Workaround
}

class IntObject: Object {
    dynamic var value = 0
}
35

受け入れられたオファーは、メモリに関して非常にコストがかかります。オブジェクトの非常に大きな「n」のリストを取得する場合があります。

これは正しいことでも間違っていることでもありませんが、ここに別の回避策を書くのは良いことだと思います。

別のアプローチ:
1つの文字列を使用してInt配列を表すことにしました。

私のレルムクラスで変数を定義しました:

dynamic var arrInt: String? = nil

そしてそれを非常に簡単に使用します:

let arrToSave = [0, 1, 33, 12232, 394]
<MY_CUSTOM_REALM_CLASS>.arrInt = arrToSave.map { String(describing: $0) }.joined(separator: ",")

そして帰り道:

let strFetched = <MY_CUSTOM_REALM_CLASS>.arrInt 
let intArray = strFetched.components(separatedBy: ",").flatMap { Int($0) }

私はこのアプローチがより良いと思うので、あなたのフィードバックを聞いて幸せになります。

5
MatanGold

さいわい、プリミティブ型の配列がRealm 3.0以降でサポートされるようになりました。 (2017年10月31日)

RLMArraysまたはLists内に直接プリミティブ型またはnullが可能な対応物(より具体的には、ブール値、整数および浮動小数点型、文字列、日付、データ)を格納できるようになりました。このようなプリミティブ値のリストを定義する場合は、面倒な単一フィールドラッパーオブジェクトを定義する必要はありません。代わりに、プリミティブ値自体を格納できます!

class MyObject : Object {
    @objc dynamic var myString: String = ""
    let myIntArray = List<Int>()
}

ソース: https://realm.io/blog/realm-cocoa-reaches-3-0/

2
Philipp Otto

エラーメッセージに示されているように、RLMArrayを使用する必要があります-または、Swift同等のListです。

参照: レルムドキュメント

1
Lars Dahmen