

現在、データの保存にRealmSwiftを使用しておりまして、  
下記のように一つのオブジェクトにいくつかの型のデータを保存しています。

[code]

    class Sample: Object {
        dynamic var number:CGFloat = 0
        dynamic var string:String = ""
    }
    
[/code]

この時に

[code]

    var floatArr:[CGFloat] = []
    
[/code]

上記のようなCGFloat型の配列に"number"のオブジェクトだけを存在するだけ取り出す。  
ということは可能でしょうか？

参考になりそうなサイトが見つからず、  
公式サイトなどを見ながら実装を試みているのですが、  
なかなかうまく実装できません。


CC BY-SA 3.0
2016-08-25T14:01:20.957
28494
2016-09-11T13:23:17.193
2016-09-11T13:23:17.193
5519
17340
question
swift realm
RealmSwiftで保存したオブジェクトから一つの変数の配列を取り出す方法


`Results`に対して、`valueForKey(_:)`または`valueForKeypath(_:)`を利用して特定のプロパティの集合だけを取り出す、ということが可能です。

[code]

    let numbers = realm
        .objects(Sample.self)
        .valueForKey("number")
    
[/code]

このとき、`numbers`の型は`NSArray`なので`CGFloat`の配列として扱うにはキャストが必要です。

[code]

    if let numbers = numbers as? [CGFloat] {
        ...
    }
    
[/code]

もう一つの解として、`map()`を利用する方法もあります。

[code]

    let numbers = realm
        .objects(Sample.self)
        .map { $0.number }
    
[/code]

もし、最終的にやりたいことが合計や平均を出したい、ということであればわざわざ配列にせずに、直接`sum()`や`average()`メソッドを利用することもできます。

余談ですが、`CGFloat`はデバイスによって型が変わる（32bitまたは64bit）のでRealmに保存するデータ型としてはお勧めしません。例えば、32bitのデバイスから64bitのデバイスに変更してデータを復元するとデータ型が異なるのでマイグレーションが必要になります。Double（またはFloat）を使いましょう。


CC BY-SA 3.0
2016-08-25T21:44:23.123
28498
2016-08-25T21:44:23.123
5519
28494
answer