【发布时间】:2014-11-11 21:02:10
【问题描述】:
我正在使用 CoreData 测试 swift,并创建了以下代码:
import UIKit
import CoreData
class Contact: NSManagedObject {
@NSManaged var name: String
@NSManaged var email: String
class func execute(){
let appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
let context:NSManagedObjectContext = appDel.managedObjectContext!
let entityDescripition = NSEntityDescription.entityForName("Contact", inManagedObjectContext: context)
let contact = Contact(entity: entityDescripition!, insertIntoManagedObjectContext: context)
contact.name = "john Apleesee"
contact.email = "john@apple.com"
context.save(nil)
let fetch:NSFetchRequest = NSFetchRequest(entityName: "Contact")
var result = context.executeFetchRequest(fetch, error: nil) as [Contact]
let firstContact = result[0] as Contact // <<-- error !
println("\(firstContact.name)")
println("\(firstContact.email)")
}
}
当我跑步时:
Contact.execute()
然后编译器抛出这个错误:
fatal error: NSArray element failed to match the Swift Array Element type
当我尝试从数组中获取值时:
let firstContact = result[0] as Contact
我猜问题出在executeFetchRequest。在 Objective-c 上,executeFetchRequest 的返回类型是 NSArray。现在在 Swift 上,返回类型是 [AnyObject]?。
我尝试将[AnyObject]? 结果转换为NSArray,但Xcode 说:
Cannot convert the expression's type '[AnyObject]?' to type 'NSArray'
我做错了什么?
我正在使用: Xcode 6.0 (6A313) 通用和 OSX 10.9.4
更新:
-----------
如果我得到executeFetchRequest 结果作为可选数组并使用[NSManagedObject] 而不是[Contact] 它可以工作。
if let result: [NSManagedObject]? = context.executeFetchRequest(fetch, error: nil) as? [NSManagedObject] {
let firstContact: NSManagedObject = result![0]
let name = firstContact.valueForKey("name") as String
let email = firstContact.valueForKey("email") as String
println("\(name)")
println("\(email)")
}
更新 2:
-----------
当实体实例没有使用您的 NSManagedObject 类加载时,就会出现这种问题。发生这种情况有几个不同的原因,所有这些都集中在“Core Data 无法在数据模型的类行中找到您为该实体指定的类。”
其中的可能性:
- 您为 Swift 类指定了错误的包
- 你忘了指定类
- 你拼错了名字
在我的情况下,我忘记指定 POB 在她的答案中显示的类。
【问题讨论】:
-
你为什么在你的
NSManagedObject子类中设置-execute:方法来执行NSFetchRequest? -
我这样做是为了简单。在这里展示问题的简单方法。
-
你试过用
let contact = NSEntityDescription.insertNewObjectForEntityForName("Contact", inManagedObjectContext: context) as Contact代替let contact = Contact(entity: entityDescripition!, insertIntoManagedObjectContext: context)吗? -
我猜问题出在executeFetchRequest。在 Objective-c 上,executeFetchRequest 的返回类型是一个 NSArray。现在在 Swift 上,返回类型是 [AnyObject?]。
-
将
println("/...替换为println("\...。
标签: ios arrays core-data collections swift