【问题标题】:Predicate on optional value in swift not workingswift中的可选值的谓词不起作用
【发布时间】:2016-07-15 06:03:03
【问题描述】:

我试图以可选值为基础,它总是使应用程序崩溃并出现以下错误。

* 由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[valueForUndefinedKey:]:此类与键 q_id 的键值编码不兼容。” * 首先抛出调用栈:

虽然模型中有变量define但是是这样定义的

var q_id : Int!

如果我将这个变量转换成 unwrap 它工作正常

var q_id = Int()

那么对于可选值的谓词还有其他方法吗?

let Qid = dictData.objectForKey("q_id") as? String
let fQuesID : Int  = Int(Qid!)!;

let predicate = NSPredicate(format: "SELF.q_id  ==  %i",fQuesID)
let arrObj : NSArray =  arrData.filteredArrayUsingPredicate(predicate) ;
            //arrData.filter { predicate.evaluateWithObject($0) }
if(arrObj.count > 0)
{
   let objPostModel : ViewPostModel = arrObj.firstObject as! ViewPostModel;
   objPostModel.isPollExpired = 1;  // 1 Means Poll Expired!
   self.tblViewPost?.reloadData();
}

它只发生在原始可选类型变量(int,float,etc ...)中

更新: 如果您将原始类型设为非可选,那么它可以正常工作

【问题讨论】:

  • 那么对于可选值的谓词还有其他方法吗? 取决于您真正想要做什么。如果q_id 可以访问,你能告诉我一个伪代码来描述你想要做什么吗?
  • 我用它来更新问题及其各自的答案......
  • 向我们展示您的代码。
  • @OOPer 代码发布

标签: ios swift nsarray nspredicate


【解决方案1】:

我假设dictData 是一个NSDictionary,其中包含键“q_id”的String 值, arrData 是一个 NSArray,它只包含 ViewPostModel。 而在 ViewPostModel 类中,q_idInt? 类型的属性。

有了所有这些,您就可以用更 Swifty 的方式编写代码:

    if let
        qId = dictData["q_id"] as? String,
        fQuesID = Int(qId)
    {
        let arrObj = (arrData as! [ViewPostModel]).filter{$0.q_id == fQuesID}
        if let objPostModel = arrObj.first {
            objPostModel.isPollExpired = 1  // 1 Means Poll Expired!
            self.tblViewPost?.reloadData()
        }
    } else {
        print("invalid q_id in dictData")
    }

(通过将arrData 声明为[ViewPostModel],您将无需使用危险的as! 运算符。您可以使其他部分更加快捷。)

一般来说,如果你只使用NSPredicate 来过滤数组,最好使用Swift 的filter 方法和闭包。

【讨论】:

  • 感谢您的快速回复.. 让我检查一下这个逻辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 2014-03-17
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多