2014-09-28 145 views
-1

我想从核心数据中获取一些数据,并且遇到轻微问题。我可以毫无问题地获取数据。如果我println(data)它将显示fooBar不与存储在它的数据存在SWIFT - 'AnyObject'没有成员名'fooBar'

"'AnyObject' does not have a member name 'fooBar'

:那一刻我试图抓住特定的数据块(即data.fooBar),它抛出了一个错误。

我不确定它为什么这样做。我试图寻找答案,并尝试了一堆不同的东西,但似乎没有任何工作。任何帮助都会很棒。谢谢。 :)

var results : Array<AnyObject> = [] 


    func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) { 

    //get the data for that storedItem 
    var appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
    var context:NSManagedObjectContext = appDel.managedObjectContext! 
    let req = NSFetchRequest(entityName: "storedItems") 

    let name:String = results[indexPath.row].name 
    req.predicate = NSPredicate(format: "name == %@", name) 
    req.returnsObjectsAsFaults = false 

    var tapResults = context.executeFetchRequest(req, error: nil)! 

    for item in tapResults { 
     println(item) //works, shows all data correctly(including subText) 
     println(item.name) //works, the only one that does for some reason??? 
     println(item.subText) //Error 'AnyObject' does not have a member name 'subText' 
    } 

下面是结果:println(item)

println(item) <NSManagedObject: 0x7f04be60> (entity: storedItems; id: 0x7f041de0 <x-coredata://DD4F8E68-2234-46B5-B1D8-AE2F75245C63/storedItems/p1> ; data: { 
alarmSound = default; 
isDefault = 0; 
name = "test"; 
sliderHours = 0; 
sliderMinutes = 0; 
sliderSeconds = 0; 
subText = "00:00:00"; 

UPDATE:基于以上vacawama答案的讨论(谢谢阿龙)。如需正确的解决方案,请参阅我接受的答案。

我itemObj类

@objc(itemObj) 
    class itemObj: NSManagedObject { 

     @NSManaged var name:String! 
     @NSManaged var sliderHours:NSNumber 
     @NSManaged var sliderMinutes:NSNumber 
     @NSManaged var sliderSeconds:NSNumber 
     @NSManaged var subText:String! 
     @NSManaged var alarmSound:String! 
     @NSManaged var isDefault:NSNumber 
    } 

我的AddItem VC:

var tResults = (context.executeFetchRequest(req, error: nil)) 

    for item in tResults as [itemObj!] { 

     println(item.name) 
     println(item.subText) 

    } 
+0

swift是类型安全的,有100多个问题处理问题完全一样。 – 2014-09-28 13:28:27

+0

@ Daij-Djan感谢downvote,正如你在我的问题中看到的,我一直在寻找一段时间(仍然是)。你能提供一个可以帮助我的链接吗? – 2014-09-28 13:31:54

+1

许多相关部分中的链接相匹配。当你问一个链接:试试这个:(我检查它,它确实解释它)http://stackoverflow.com/questions/24770515/swift-anyobject-does-not-have-a-member-named-removeatindex? rq = 1 OR this:http://stackoverflow.com/questions/25223549/swift-anyobject-does-not-have-a-member-named-make?rq=1 – 2014-09-28 13:35:28

回答

3

executeFetchRequest返回AnyObject一个可选的阵列。你不应该强制解开它(这可能导致崩溃)。所以可选解开它,做一个可选的CAST(as?),以确保该类型是正确的:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    let appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
    let context:NSManagedObjectContext = appDel.managedObjectContext! 
    let req = NSFetchRequest(entityName: "storedItems") 

    let name:String = results[indexPath.row].name 
    req.predicate = NSPredicate(format: "name == %@", name) 
    req.returnsObjectsAsFaults = false 

    let tapResults = context.executeFetchRequest(req, error: nil) 

    if let presentResults = tapResults { 
     if let castedResults = presentResults as? [MyManagedObjectSubclass] { 
      for item in castedResults { 
       println(item) 
       println(item.name) 
       println(item.subText) 
      } 
     } 
    } 
} 

我也改变了所有的var S的let小号,因为他们并不需要是可变的。

只需用您的NSManagedObject子类替换MyManagedObjectSubclass即可。

+1

我明白了,生病了,看看这里发生了什么......谢谢。 – 2014-09-28 18:29:57

相关问题