RealmSwift:将结果转换为Swift数组

时间:2015-06-28 12:50:42

标签: ios swift realm

我想要实施的内容:

class func getSomeObject() -> [SomeObject]? {
    let objects = Realm().objects(SomeObject)

    return objects.count > 0 ? objects : nil
}

如果[SomeObject]

,我如何将对象改为Results

11 个答案:

答案 0 :(得分:344)

很奇怪,答案非常直截了当。我是这样做的:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes

z = np.random.rand(20, 20)
x, y = np.arange(20), np.arange(20)
y2 = np.random.rand(20)
fig = plt.figure(figsize=(8, 8))
gs = mpl.gridspec.GridSpec(2, 2, height_ratios=[1, 2], width_ratios=[2, 1])
ax1 = fig.add_subplot(gs[1, 0])
ax2 = fig.add_subplot(gs[0, 0], sharex=ax1)
cont = ax1.contourf(x, y, z, 20)
plt.tick_params(which='both', top=False, right=False)
ax2.plot(x, y2, color='g')
plt.tick_params(which='both', top=False, right=False)




axins = inset_axes(ax1,
               width="5%", # width = 10% of parent_bbox width
               height="100%", # height : 50%
               loc=6,
               bbox_to_anchor=(1.05, 0., 1, 1),
               bbox_transform=ax1.transAxes,
               borderpad=0,
           )

cbar = plt.colorbar(cont, cax=axins)
plt.savefig('figure.jpg',bbox_inches='tight',dpi=200)

答案 1 :(得分:29)

如果您绝对必须将Results转换为Array,请记住性能和内存开销,因为Results是懒惰的。但是您可以在一行中执行此操作,例如swift 2.0中的results.map { $0 }(或1.2中的map(results) { $0 })。

答案 2 :(得分:16)

我找到了解决方案。在结果上创建扩展。

extension Results {
    func toArray<T>(ofType: T.Type) -> [T] {
        var array = [T]()
        for i in 0 ..< count {
            if let result = self[i] as? T {
                array.append(result)
            }
        }

        return array
    }
}

并使用like

class func getSomeObject() -> [SomeObject]? {
    let objects = Realm().objects(SomeObject).toArray(SomeObject) as [SomeObject]

    return objects.count > 0 ? objects : nil
}

答案 3 :(得分:6)

Swift 3

extension Results {
    func toArray<T>(ofType: T.Type) -> [T] {
        var array = [T]()
        for i in 0 ..< count {
            if let result = self[i] as? T {
                array.append(result)
            }
        }

        return array
    }
}

<强>用法

class func getSomeObject() -> [SomeObject]? {
   let defaultRealm = try! Realm()
    let objects = defaultRealm.objects(SomeObject.self).toArray(ofType : SomeObject.self) as [SomeObject]

    return objects.count > 0 ? objects : nil
}

替代方案:使用泛型

class func getSomeObject() -> [T]? {
        let objects = Realm().objects(T.self as! Object.Type).toArray(ofType : T.self) as [T]

        return objects.count > 0 ? objects : nil
}

答案 4 :(得分:4)

这是将Results转换为数组的另一种方式,其中包含 Swift 3 的扩展名。

extension Results {
    func toArray() -> [T] {
        return self.map { $0 }
    }
}

对于 Swift 4 和Xcode 9.2

extension Results {
    func toArray<T>(type: T.Type) -> [T] {
        return flatMap { $0 as? T }
    }
}

不推荐使用 Xcode 10 flatMap,您可以使用compactMap进行映射。

extension Results {
    func toArray<T>(type: T.Type) -> [T] {
        return compactMap { $0 as? T }
    }
}

答案 5 :(得分:3)

将结果转换为数组并不是一个好主意,因为结果是懒惰的。但如果你需要试试这个:

func toArray<T>(ofType: T.Type) -> [T] {
    return flatMap { $0 as? T }
}

但更好的方法是在任何需要的地方传递结果。您也可以将结果转换为List而不是Array。

List(realm.objects(class))

如果第一个功能不起作用,你可以试试这个:

var refrenceBook:[RefrenceProtocol] = []
let faceTypes = Array(realm.objects(FaceType))
refrenceBook = faceTypes.map({$0 as FaceType})

答案 6 :(得分:2)

我不确定,是否有任何有效的方法可以做到这一点。

但你可以通过创建一个Swift数组并将其附加到循环中来实现。

class func getSomeObject() -> [SomeObject]? {
    var someObjects: [SomeObject] = []
    let objects = Realm().objects(SomeObject)
    for object in objects{
        someObjects += [object]
    }
    return objects.count > 0 ? someObjects : nil
}

如果你觉得它太慢了。我建议你直接传递Realm Results对象。

答案 7 :(得分:2)

extension Results {
    var array: [Element]? {
        return self.count > 0 ? self.map { $0 } : nil
    }
}

所以,你可以使用:

Realm().objects(SomeClass.self).filter("someKey ENDSWITH %@", "sth").array

答案 8 :(得分:2)

Swift 4,Realm 3

的解决方案
extension Results {
    func toArray<T>(ofType: T.Type) -> [T] {
        let array = Array(self) as! [T]
        return array
    }
}

现在可以按照以下方式进行转换

let array = Realm().objects(SomeClass).toArray(ofType: SomeClass.self)

答案 9 :(得分:2)

使用Swift 4.2,它非常简单:

extension Results {
  func toArray() -> [Element] {
    return compactMap {
      $0
    }
  }

所有必需的泛型信息已经是我们扩展的Results的一部分。

答案 10 :(得分:2)

extension Results {
    func materialize() -> [Element] {
        return Array(self)
    }
}