在领域查询(使用Swift)

我正在玩realm.io。 我写了几个对象,现在我想查询它们。 我的数据类:

class Sample : RLMObject { dynamic var sampleKey : String = "" } 

和我的查询代码

 @IBAction func readLocalRecord(sender: UIButton) { let s : NSString = NSString.stringWithString("sampleKey == SampleValue") let p : NSPredicate = NSPredicate(format: "sampleKey = %@", argumentArray: NSArray(object: NSString.stringWithString("SampleValue"))) // the following throws exception, that I cannot catch in Swift: // 'Unsupported predicate value type', reason: 'Object type any not supported' let r = Sample.objectsWithPredicate(p) } 

网站和RLMObject头,表明我应该能够说Sample.objectsWhere(“sampleKey ='SampleValue'”)(或类似),但对象有一个编译错误,抱怨函数不存在,没有自动完成它。 所以我尝试了与objectsForPredicate,而是这样说,types'任何'(挖掘通过头,我发现这等于ObjC的'ID'的types在领土语言)。 我在这里做错了什么? 我试图明确,确保使用NSString而不是string和NSArray而不是数组,但仍然是东西被解释为'id'而不是一个特定的types。

有什么build议么?

干杯

-Nik

你的代码在Xcode 6 beta 5中对我来说工作的很好。顺便说一句,你不需要在这里明确地使用NSArrayNSString – Swift会为你连接到Objective-Ctypes。 下面的代码适用于我,并打印出我期望看到的对象:

 import Realm class Sample : RLMObject { dynamic var sampleKey : String = "" } @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func readLocalRecord() { // create some sample records RLMRealm.defaultRealm().beginWriteTransaction() var s = Sample() s.sampleKey = "Testing" RLMRealm.defaultRealm().addObject(s) var s2 = Sample() s2.sampleKey = "SampleValue" RLMRealm.defaultRealm().addObject(s2) RLMRealm.defaultRealm().commitWriteTransaction() let p : NSPredicate = NSPredicate(format: "sampleKey = %@", argumentArray: [ "SampleValue" ]) let r = Sample.objectsWithPredicate(p) println(r) } func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool { readLocalRecord() return true } } 

输出是:

 RLMArray <0x7fe8241218c0> ( [0] Sample { sampleKey = SampleValue; } } 

请注意,Realm的objectsWithPredicate方法会返回一个Realm数组,而不是一个正常的数组。

一个NSArray将总是返回[AnyObject]的等价物? 即使指定了string的types,当创build它时,其他对象也不一定知道该types,如果可以假定多个。

我会尝试创build一个types为[String]的数组,然后传递它,或者直接使用带有参数的NSPredicate(predicateWithFormat:arguments:),而不是在数组中 – 也许这会工作?

最后,我不熟悉领域,但是我发现,如果在swift中没有可用的东西,它是可用的,但只有另一种方法来做到这一点。 例如,RLMObject上是否有“对象”数组? 如果是这样,你可以做objects.filter({$ 0.key == value)),或者一个完整的块(它允许使用断点等进行debugging – 我个人更喜欢使用NSPredicates。