Obj-C到Swift Coredata的转换

时间:2015-09-03 17:33:11

标签: objective-c swift core-data

好的,开始查看Swift并尝试使用现有Obj-C程序中的Coredata模型和SQLfile

  • 创建了新的快速Coredata项目
  • 用现有模型替换了coredata模型
  • 将程序指向sql数据文件
  • 创建Swift NSMangagedObject子类

运行程序,得到类类型不匹配的错误。

  • 删除Swift NSMangedObject子类并创建Objective-C版本

运行程序,没有问题,fetch执行得很好。

我想最终在swift中重写程序,但我必须处理旧的SQL数据文件。有没有办法让这个工作,而不必混合这两种语言?

我没试过这个,但这是轻量级迁移会做的吗?

- [编辑] ---

错误消息在控制台中:

"致命错误:NSAarry元素无法匹配Swift数组元素类型"

获取代码:

 let request = NSFetchRequest(entityName: "Account")
 var error:NSError?=nil
 var fetchResults = managedObjectContext?executeFetchRequest(request, error: &error)! as [Account]

 for aAccount in fetchResults {
 println(aAccount.name)
 }

此代码确实有效 - 如果NSManagedObject子类(帐户)是Obj-C

此代码不起作用 - 如果NSManagedObject子类(Account)是Swift - 这是我收到错误的时候。

NSManagedObject子类是通过" Create NSMangedObject Subclass"生成的。在XCode中。

当100%Obj-C时,CoreData模型和SQL数据文件来自之前正在运行的程序。

- [编辑2] -------

除非我做错了什么,否则它是打字的......

 var fetchResults = ...(request, error: &error)! as [Account]

为了测试,我将上面改为:

 var fetchResults = ...(request, error: &error)! as [NSManagedObject] 

通过此更改,以下工作 - 正如您所期望的那样:

 for aAccount in fetchResults {

        println(aAccount.valueForKey("name")!)     
 }

以下操作不起作用(在for-in循环中添加它):

 if let account = aAccount as? Account {
            println(account.name)
 }

所以,它不会让我加入Swift帐户类。我使用了Xcode"创建ManagedObject Subclass"创建Swift子类。

- [编辑3] -----

XCode版本:6.1

Account.swift文件:

 import Foundation
 import Coredata

 class Account: NSManagedObject {

 @NSManaged var name: String
 @NSManaged var number: String
 @NSManaged var type: String
 @NSManaged var status: String

 }

如果我创建一个Obj-C版本的Account(Account.h和Account.m),将它们添加到Bridging-Header,删除.swift版本,一切正常。

1 个答案:

答案 0 :(得分:0)

您需要将NSManagedObject中的fetchedResults强制转换为Swift类,以便直接访问Swift类的属性。

for aAccount in fetchResults {
 println(aAccount.name)   // NOT GOING TO WORK
 } 

aAccount将是NSManagedObject,因此您必须将其强制转换为Swift类,以便通过Swift类(aAccount.name)访问它的属性。否则你必须像这样访问该属性

aAccount.getValueForKey("Name")

另外试试这个

for managedObject in fetchResults {
 if let account = managedObject as? Account {
     println(account.name)   
  }
 } 

这是我的一个Swift模型类,尝试添加@objc()

import Foundation
import CoreData

@objc(AssetX)
class AssetX: BaseNode {

    @NSManaged var childCostTotal: NSNumber
    @NSManaged var dateOfManufacture: NSDate
    @NSManaged var dateOfPurchase: NSDate
    @NSManaged var dateOfValuation: NSDate
    @NSManaged var invoice: NSAttributedString
    @NSManaged var make: String
    @NSManaged var model: String
    @NSManaged var photo: NSAttributedString
    @NSManaged var purchaseCost: NSNumber
    @NSManaged var serialNo: String
    @NSManaged var valuationCost: NSNumber
    @NSManaged var category: AssetCategory
}

基类是:

import Foundation
import CoreData

@objc(BaseNode)
class BaseNode: NSManagedObject {

    @NSManaged var canCollapse: NSNumber
    @NSManaged var canExpand: NSNumber
    @NSManaged var details: NSAttributedString
    @NSManaged var displayName: String
    @NSManaged var isExpanded: NSNumber
    @NSManaged var isLeaf: NSNumber
    @NSManaged var isSelectable: NSNumber
    @NSManaged var isSpecialGroup: NSNumber
    @NSManaged var reminderDate: NSDate
    @NSManaged var reminderPeriod: String
    @NSManaged var sortIndex: NSNumber
    @NSManaged var status: NSNumber
    @NSManaged var children: NSSet
    @NSManaged var linkedTo: People
    @NSManaged var parent: BaseNode

    var found:Bool = false

}