我无法让NSManagedObject工作。
在一个文件中我有:
import UIKit
import CoreData
@objc(Location)
class Location: NSManagedObject {
@NSManaged var title:String
@NSManaged var lat:NSDecimalNumber
@NSManaged var lon:NSDecimalNumber
@NSManaged var course:NSDecimalNumber
@NSManaged var alt:NSDecimalNumber
}
在TableView类中,我有:
...
var locations:NSArray = [Location]()
override func viewDidLoad() {
super.viewDidLoad()
locations = self.getAllLocations()
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var logCell:TableViewCell = self.tableView.dequeueReusableCellWithIdentifier("loggedCell") as TableViewCell
logCell.loggedTitle.text = locations[indexPath.row].title
if let lat = locations[indexPath.row].lat {
println(lat)
}
return logCell
}
func getAllLocations() -> [Location] {
let appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
let context:NSManagedObjectContext = appDel.managedObjectContext!
var request = NSFetchRequest(entityName: "Locations")
request.returnsObjectsAsFaults = false
if let results = context.executeFetchRequest(request, error: nil) {
return results as [Location]
} else {
// Failed, return empty error. Alternatively, report error.
return []
}
}
...
我可以从CoreData中检索值。如果我println(locations [indexPath.row])就在那里。但是在func tableView中我只能获得标题。 lat,lon,除了'AnyObject'以外的所有标题错误都没有名为'lat'的成员,如下所示:
if let lat = locations[indexPath.row].lat {
println(lat)
}
我确信它是基本的,因为我是Swift和iOS开发的新手。我希望在正确的方向上找到一点。
答案 0 :(得分:1)
部分是关于Swift的严格打字,部分是关于Swift类型和Cocoa(Objective-C)类型之间的相互作用。
这里的问题是你输入了locations
作为NSArray。这是一个Cocoa系列,而不是Swift系列。斯威夫特不知道NSArray里面是什么样的东西。
你可能知道(或相信)locations[indexPath.row]
处的位置是一个位置,但Swift不知道这一点。你必须通过强制转换(使用as
)告诉它。
或者,如果没有理由不这样做,请将locations
键入为位置的Swift数组,[Location]
。现在Swift知道它里面有什么。我还应该指出,事实上,你的初始化程序是没有意义的:
var locations:NSArray = [Location]()
首先创建一个位置的Swift数组,是的,然后通过键入locations
作为NSArray并分配到它,你扔掉所有知道这个东西应该只包含Location对象。