从Swift中的Core Data获取值

时间:2014-10-24 09:53:15

标签: ios core-data swift

我试图从CoreData中拉出并打印两个值。一个是速度,另一个是度。但事情并没有按计划进行。首先,这是代码的一部分:

  // Start fetching from CoreData

            request = NSFetchRequest(entityName: "WindData")

            request.returnsObjectsAsFaults = false

            results = context.executeFetchRequest(request, error: nil)

            if results!.count > 0 {

                for result: AnyObject in results! {

                    println(result)
                    println(result.speed)
                    println(result.degrees)


                }
            }
            else {
                println("No data")
            }

当我只是打印结果时,我得到了值:

<NSManagedObject: 0x7f944a734e80> (entity: WindData; id: 0xd000000000740000 <x-coredata://762EB8C2-DDCF-43F5-8DFC-FAB9A29532E1/WindData/p29> ; data: {
degrees = 190;
speed = 8; })

println(result.speed)在consol中写道:2.34181e-38 和println(result.degrees)不允许我编译并告诉我AnyObject没有名为degrees的成员(虽然它显然有)

对于任何新手错误感到抱歉,这是我第一次在Stackoverflow上发帖。

以下是完整代码:

    //
//  ViewController.swift
//  KitesurfioApp
//
//  Created by Lasse Kristensen on 24/10/14.
//  Copyright (c) 2014 Lasse Kristensen. All rights reserved.
//

import UIKit
import CoreData

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()


        // Set logo in nav bar

        navigationItem.titleView = UIImageView(image: UIImage(named: "logo"))



        // Global save values

        var appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate

        var context: NSManagedObjectContext = appDel.managedObjectContext!



        // JSON Fetching

        let urlPath = "http://api.openweathermap.org/data/2.5/weather?lat=55.564120&lon=12.568605"

        let url = NSURL(string: urlPath)

        let session = NSURLSession.sharedSession()

        let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in

            if (error != nil) {
                println(error)
            }
            else {


                // Delete old entries in CoreData

                var request = NSFetchRequest(entityName: "WindData")

                request.returnsObjectsAsFaults = false

                var results = context.executeFetchRequest(request, error: nil)

                for result in results! {

                    context.deleteObject(result as NSManagedObject)
                    context.save(nil)

                }

                // Start fetching JSON


                let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary


                var item = jsonResult["wind"] as NSDictionary

                var degrees:Int = item["deg"] as NSInteger
                var speed:Float = item["speed"] as Float


                // Start saving JSON

                var newItem = NSEntityDescription.insertNewObjectForEntityForName("WindData", inManagedObjectContext: context) as NSManagedObject

                var speedValue:NSNumber = speed as NSNumber
                var degreesValue:NSNumber = degrees as NSNumber

                newItem.setValue(speedValue, forKey: "speed")
                newItem.setValue(degreesValue, forKey: "degrees")

                context.save(nil)



            }

        })

        task.resume()

        // Start fetching from CoreData

        var request = NSFetchRequest(entityName: "WindData")

        request = NSFetchRequest(entityName: "WindData")

        request.returnsObjectsAsFaults = false

        var results = context.executeFetchRequest(request, error: nil)

        if results!.count > 0 {

            for result: AnyObject in results! as [WindData] {

                println(result)
                println(result.speed)

            }
        }
        else {
            println("No data")
        }


    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

1 个答案:

答案 0 :(得分:8)

您需要将AnyObject强制转换为具有属性degree等的类。AnyObject不知道您需要将数组[AnyObject]转发给您的类属性你的类数组

for result in results! as [NSManagedObject] {

    println(result)
    println(result.valueForKey("speed")!)
    println(result.valueForKey("degrees")!)
}