我想要实施的内容:
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject)
return objects.count > 0 ? objects : nil
}
如果[SomeObject]
?
Results
?
答案 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)
}
}