我正在学习Objective-C /
Cocoa Touch和Core Data.那么,在纯粹
Swift中编写的iOS应用程序项目中实现数据存储的新的可能性是什么?我真的很喜欢这种语言,但据我所知,所有的核心数据方法都是用Objective-C编写的.那么核心数据类/方法会自动转换为Swift代码,还是要将Core数据和Swift代码的Objective-C代码混合在一起吗?
解决方法
这是我如何实现核心数据.
几个非常重要的笔记:
>您必须将其添加到您的NSManagedobject类中:
@objc(为MyObject)
>您必须将实体名称添加到.xcdatamodel中的默认配置类(包括图片)
>你不能简单地做一个NSManagedobject.
var myObject : MyObject = MyObject()
你必须这样做:
let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate let context: NSManagedobjectContext = appDelegate.managedobjectContext let entityName: String = "MyObject" let myEntityDescription = NSEntityDescription.entityForName(entityName,inManagedobjectContext: context) var myObject = MyObject(entity: myEntityDescription,insertIntoManagedobjectContext: context)
这是我的NSManagedobject.我包括两个提取方法以及一个用于对象构造的类方法.
您可能会注意到,我正在利用新的枚举系统,以便我可以轻松访问我的实体名称和实体属性
import UIKit
import CoreData
enum MyObjectPropertyList {
case name
func description() -> String {
switch self {
case .name:
return "name"
}
}
}
@objc(MyObject)
class MyObject: NSManagedobject {
@NSManaged var name: String
//
//// CREATE CLASS OBJECT
//
class func createMyObject (propertyName:MyObjectPropertyList,value:String,context: NSManagedobjectContext) -> MyObject? {
if !value.isEmpty {
let propertyType = propertyName.description()
let entityName = "MyObject"
let request : NSFetchRequest = NSFetchRequest(entityName: entityName)
request.returnsObjectsAsFaults = false
request.predicate = nspredicate(format: "\(propertyType) = %@",value)
var error: NSError? = nil
var matches: NSArray = context.executeFetchRequest(request,error: &error)
if (matches.count > 1) {
// handle error
return matches[0] as? MyObject
} else if matches.count == 0 {
let entityDescription = NSEntityDescription.entityForName(entityName,inManagedobjectContext: context)
var myObject : MyObject = MyObject(entity: entityDescription,insertIntoManagedobjectContext: context)
myObject.name = value
return myObject
}
else {
println(matches[0])
return matches[0] as? MyObject
}
}
return nil
}
}
//
//// FETCH REQUESTS
//
func myGeneralFetchRequest (entity : CoreDataEntities,property : MyObjectPropertyList,context : NSManagedobjectContext) -> AnyObject[]?{
let entityName = entity.description()
let propertyName = property.description()
let request :NSFetchRequest = NSFetchRequest(entityName: entityName)
request.returnsObjectsAsFaults = false
let sortDescriptor : NSSortDescriptor = NSSortDescriptor(key: propertyName,ascending: true)
request.sortDescriptors = [sortDescriptor]
var error: NSError? = nil
var matches: NSArray = context.executeFetchRequest(request,error: &error)
if matches.count > 0 {
return matches
}
else {
return nil
}
}
func myNameFetchRequest (entity : CoreDataEntities,value : String,context : NSManagedobjectContext) -> AnyObject[]? {
let entityName = entity.description()
let propertyName = property.description()
let request :NSFetchRequest = NSFetchRequest(entityName: entityName)
request.returnsObjectsAsFaults = false
request.predicate = nspredicate(format: "\(propertyName) = %@",value)
let sortDescriptor :NSSortDescriptor = NSSortDescriptor(key: propertyName,error: &error)
if matches.count > 0 {
return matches
}
else {
return nil
}
}
//
//// PRINT FETCH REQUEST
//
func printFetchedArrayList (myarray:AnyObject[]) {
if myarray.count > 0 {
println("Has \(myarray.count) object")
for myobject : AnyObject in myarray {
var anObject = myobject as MyObject
var thename = anObject.name
println(thename)
}
}
else {
println("empty fetch")
}
}
这是我的视图控制器
import UIKit
import CoreData
enum CoreDataEntities {
case MyObject
func description() -> String {
switch self {
case .MyObject:
return "MyObject"
}
}
}
class ViewController: UIViewController {
//
//// MOC
//
var managedobjectContext : NSManagedobjectContext = NSManagedobjectContext()
//
//// Text Field
//
@IBOutlet var myTextField : UITextField
//
//// BUTTONS
//
@IBAction func saveButtonPress(sender : UIButton) {
makeEntityAction()
}
@IBAction func fetchButtonPress(sender : UIButton) {
fetchObjectAction()
}
//
//// ACTIONS
//
func makeEntityAction () {
println("-- Make action --")
let value:String = self.myTextField.text
var myObject : MyObject = MyObject.createMyObject(MyObjectPropertyList.name,value : value,context: self.managedobjectContext)!
saveContext(self.managedobjectContext)
}
func fetchObjectAction () {
println("-- Fetch action --")
if let myTotalarray = myGeneralFetchRequest(CoreDataEntities.MyObject,MyObjectPropertyList.name,self.managedobjectContext) {
printFetchedArrayList(myTotalarray)
}
if let mySinglearray: AnyObject[] = myNameFetchRequest(CoreDataEntities.MyObject,"Bill",self.managedobjectContext) {
println("(-- --)")
printFetchedArrayList(mySinglearray)
}
}
//
//// LOAD & SAVE
//
func loadContext () {
let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let context: NSManagedobjectContext = appDelegate.managedobjectContext
self.managedobjectContext = context
}
func saveContext (context: NSManagedobjectContext) {
var error: NSError? = nil
context.save(&error)
}
//
//// LOAD
//
func myLoad () {
loadContext ()
println("Loaded Context")
}
//
//// Life Cycle
//
override func viewDidLoad() {
super.viewDidLoad()
myLoad ()
}
}