2014-10-20 58 views
2

我想從我的coredata實體打印出「用戶名」值。如何從swift'AnyObject'中的coredata字典輸出值沒有名爲'username?的成員?

var request = NSFetchRequest(entityName: "Users") 

request.returnsObjectsAsFaults = false 

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

if (results?.count > 0) { 

    for result: AnyObject in results! { 
     println(result.username) 
    } 
} 

行println(result.username)給我一個'AnyObject'的編譯錯誤沒有一個名爲'username'的成員。

+0

確實爲結果:在NSDictionary的結果工作?否則,請嘗試使用var resultDict:NSDictionary = result作爲NSDictionary將其在for循環中向下轉換。 – Zhang 2014-10-20 04:36:42

回答

3

你必須管理對象的數組轉換爲正確的類型:

for result in results! as [Users] { 
    println(result.username) 
} 

這假定您已經創建了「用戶」的實體管理對象的子類。

你也應該區別executeFetchRequest()是否返回nil (即取請求失敗),或0(發現即無對象), 並使用error參數:

var error : NSError? 
if let results = context.executeFetchRequest(request, error: &error) { 
    if (results.count > 0) { 
     for result in results as [Users] { 
      println(result.username) 
     } 
    } else { 
     println("No Users") 
    } 
} else { 
    println("Fetch failed: \(error)") 
    // Handle error ... 
} 

更新斯威夫特2/Xcode的7使用try/catch錯誤處理:

do { 
    let results = try context.executeFetchRequest(request) as! [Users] 
    if (results.count > 0) { 
     for result in results { 
      print(result.username) 
     } 
    } else { 
     print("No Users") 
    } 
} catch let error as NSError { 
    // failure 
    print("Fetch failed: \(error.localizedDescription)") 
} 

注意,強制投這裏可以接受as! [Users]。 返回的對象始終是核心數據模型檢查器中配置的對應類的實例,否則應該提前檢測到 a 編程錯誤

1

Martin's answer絕對允許您訪問您的對象的屬性,但強制強制轉換。不管喜不喜歡,斯威夫特強大的類型系統都是未來。從返回請求返回結果時,可以考慮測試類型。

func executeFetchRequestT<T:AnyObject>(request:NSFetchRequest, managedObjectContext:NSManagedObjectContext, error: NSErrorPointer = nil) -> [T]? { 
    var localError: NSError? = nil 

    if let results:[AnyObject] = managedObjectContext.executeFetchRequest(request, error: &localError) { 
     if results.count > 0 { 
      if results[0] is T { 
       let casted:[T] = results as [T] 
       return .Some(casted) 
      } 

      if error != nil { 
       error.memory = NSError(domain: "error_domain", code: 0, userInfo: [NSLocalizedDescriptionKey: "Object in fetched results is not the expected type."]) 
      } 

     } else if 0 == results.count { 
      return [T]() // just return an empty array 
     } 
    } 

    if error != nil && localError != nil { 
     error.memory = localError! 
    } 

    return .None 
} 

使用此方法,您可以輸入結果並在類型不正確時得到錯誤。

var fetchError:NSError? = nil 

if let results:[Users] = executeFetchRequestT(fetchRequest, managedObjectContext: managedObjectContext, error: &fetchError) { 

    for user in results { 
     // access the results with confidence of the correct type 
    } 

} else { 

    // should have an error condition, handle it appropriately 
    assertFailure("something bad happened") 

} 
+0

在爲實體(如本例中的「用戶」)執行獲取請求時,返回的對象始終是核心數據模型檢查器中配置的對應類的實例。 – 2015-09-16 11:44:26

1

更改您的循環這個

 for result: AnyObject in results! { 

      if let user: AnyObject = result.valueForKey("username") { 

       println(user) 

      } 

     } 

的修復程序使用valueForKey( 「字符串」)

相關問題