如何使用选项字典在Swift中closuresCore Data Write-Ahead日志logging?

如何closures核心数据中使用苹果新编程语言Swift的SQLite预写日志(WAL)?

在ObjC中,我用来在选项字典中传递键值对@“journal_mode”:@“DELETE”:

[storeCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self databaseURL] options:@{NSMigratePersistentStoresAutomaticallyOption: @YES, NSInferMappingModelAutomaticallyOption: @YES, @"journal_mode": @"DELETE"} error:&error] 

但是在Swift中,只有在NSDictionary中允许相同的types,所以混合BOOL(映射到NSNumber)和NSString是不可能的。

有任何想法吗?

Swift字典默认是强types的,但是你可以定义你的字典应该接受的types。

 var options = Dictionary<NSObject, AnyObject>() options[NSMigratePersistentStoresAutomaticallyOption] = true options[NSInferMappingModelAutomaticallyOption] = true options["journal_mode"] = "DELETE" [storeCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self databaseURL] options:opitons error:&error] 

如果您不确定函数期望的字典types,请查看函数声明 :

 func addPersistentStoreWithType(_ storeType: String!, configuration configuration: String!, URL storeURL: NSURL!, options options: [NSObject : AnyObject]!, error error: AutoreleasingUnsafePointer<NSError?>) -> NSPersistentStore! 

它描述了它所期望的字典types – Dictionary<NSObject, AnyObject>

实际上,任何从Objective-C桥接的字典都将以这种方式input。 从Apple Docs :

Swift也自动桥接Dictionarytypes和NSDictionary类。 当你从一个NSDictionary对象桥接到一个Swift字典时,结果字典的types是[NSObject:AnyObject]。

您可以将任何NSDictionary对象桥接到Swift字典,因为所有Objective-C对象都是AnyObject兼容的。 回想一下,如果一个对象是一个Objective-C或Swift类的实例,或者它可以被桥接到一个对象,那么这个对象是AnyObject兼容的。 所有的NSDictionary对象都可以桥接到Swift字典,所以Swift编译器在导入Objective-C API时用[NSObject:AnyObject]代替NSDictionary类。

同样,当您在Objective-C代码中使用Swift类或协议时,导入器将与Objective-C兼容的Swift字典重新映射为NSDictionary对象。

这些答案很接近,但实际上并没有为我工作。 以下工作。 该选项必须与NSSQLitePragmasOption

 var options = Dictionary<NSObject, AnyObject>() options[NSMigratePersistentStoresAutomaticallyOption] = true options[NSInferMappingModelAutomaticallyOption] = true options[NSSQLitePragmasOption] = ["journal_mode" : "DELETE"] if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: options, error: &error) == nil { ... } 

一个提示,确保你传递一个字典到NSSQLitePragmasOption。 例如

 url = NSBundle.mainBundle().URLForResource(name, withExtension: "momd") let coordinator = NSPersistentStoreCoordinator(managedObjectModel: NSManagedObjectModel(contentsOfURL: url!)!) var err: NSError? = nil url = dataDir.URLByAppendingPathComponent(name + ".sqlite") options = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true, NSSQLitePragmasOption: ["journal_mode": "DELETE"]] coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: options, error: &err)