好的,开始查看Swift并尝试使用现有Obj-C程序中的Coredata
模型和SQLfile
。
NSMangagedObject
子类运行程序,得到类类型不匹配的错误。
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版本,一切正常。
答案 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
}