2016-01-25 28 views
0

的Xcode開始抱怨下面的代碼(運行良好W/O了好幾個月的任何問題):不明確使用「標」

let request = NSFetchRequest(entityName: entity) 

     request.returnsDistinctResults = true 

     let nsArr: NSArray = ["int_field", "date_field"] 

     request.propertiesToFetch = nsArr as [AnyObject] 

     request.resultType = .DictionaryResultType 

     let predicate = NSPredicate(format: "(val1 == %d) AND (val2 == %@)", argumentArray: [anIntegerValue, aStringValue]) 

     request.predicate = predicate 

     do { 

      let results: NSArray = try moc.executeFetchRequest(request) 

      for result in results { 

到目前爲止一切都很好。但是,當我嘗試從結果中提取數據,我得到一個「不明確使用‘標’的錯誤在以下方面:

let val1 = result["int_field"] as! Int 
let val2 = result["date_field"] as! NSDate 

不知道發生了什麼,但如果我代替上述語法:

let val1 = (result as! NSDictionary) ["int_field"] as! Int 
let val2 = (result as! NSDictionary)["date_field"] as! NSDate 

它的工作原理。什麼我不清楚就是爲什麼在聲明下面是不夠的(或在IOS 9.2發生了什麼事導致此):

request.resultType = .DictionaryResultType 

的思考?

回答

0

經過仔細觀察,Vadian提出的解決方案並不適用於我。

唯一令工作是我原來的解決方案:

let val1 = (result as! NSDictionary) ["int_field"] as! Int 
let val2 = (result as! NSDictionary)["date_field"] as! NSDate 

看來,觸發了進口境界框架(解決的又一依賴)。我只能說當我移除Realm時,錯誤/問題就消失了。

儘管我現在沒有實際使用Realm,但仍然出現這種情況。

1

請使用Swift原生集合類型,它們更容易維護。

首先,將數組直接分配給propertiesToFetch。沒有NSArray,沒有[AnyObject]

request.propertiesToFetch = ["int_field", "date_field"] 

你的結果是具有String鍵和Int/NSDate值字典的陣列。多種類型必須由AnyObject代表。現在

do { 
    let results = try moc.executeFetchRequest(request) as! [[String:AnyObject]] 

,因爲編譯器知道數組包含字典,這將順利編譯

for result in results { 
    let val1 = result["int_field"] as! Int 
    let val2 = result["date_field"] as! NSDate 
    } 
} 

基金會收藏類型不包含類型信息,並可能導致這些Ambiguous use消息。

+0

有趣。雖然我'得到'爲什麼有必要將類型添加到結果中(並且我將您的觀點放在Swift本機集合上),但我不明白是什麼突然導致xcode現在發出抱怨(代碼幾個月以來一直在快樂地運行)。思考? – goggelj

+0

Swift 2.0和2.1有一些變化。如果項目在早期版本中編譯成功,則應用程序運行良好。這些問題總是在編譯時運行不同的Swift版本。 – vadian

+0

這就是讓我困惑的原因。它今天開始抱怨。它一直在編譯和運行良好,無需擔心。一些東西已經改變了,解決方案(你和我的)都在工作。謝謝! – goggelj