模糊地使用'下标'

时间:2016-01-25 18:09:24

标签: core-data swift2

xcode开始抱怨以下代码(在几个月内没有任何问题工作正常):

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if (holder instanceof DataObjectHolder) {
       // Do this...
    } else if (holder instanceof GroupViewHolder) {
       // ...do that
    }
}

到目前为止一切都很好。但是当我尝试从结果中提取数据时,我得到了一个'模糊地使用'下标'以下错误:

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

它有效。我不清楚的是为什么声明以下内容是不够的(或者在ios 9.2中发生的事情导致这种情况):

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

思想?

2 个答案:

答案 0 :(得分: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条消息。

答案 1 :(得分:0)

仔细观察后,Vadian建议的解决方案对我不起作用。

唯一有效的是我最初的解决方案:

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

似乎触发器正在导入Realm框架(以解决另一个依赖关系)。我只能说,当我删除Realm时,错误/问题就会消失。

尽管我目前还没有真正使用Realm,但仍然会发生这种情况。