如何使用NSManagedObject并获取所有数据?

时间:2014-11-26 02:15:46

标签: ios core-data swift

我无法让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开发的新手。我希望在正确的方向上找到一点。

1 个答案:

答案 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对象。