2015-05-13 111 views
1

AnyThe第一条语句不返回任何值,而第二条语句正常工作。是否可以指定属性名称作为避免硬编码的参数之一?核心数据的管理对象属性作为参数

let predicate = NSPredicate(format: "%@ == %@", "id","553178666d61d70c24fe4221") 

let predicate = NSPredicate(format: "id == %@", "553178666d61d70c24fe4221") 

这是一个完整的解决方案由于@FreeNickname

class func searchForObject(propertyName:NSString,property:NSString,className:String,single:Bool)->AnyObject?{ 
     let fetchRequest = NSFetchRequest(entityName: className) 
     let predicate = NSPredicate(format: "%K == %@", argumentArray: [propertyName, property]) 
     var appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
     fetchRequest.predicate = predicate 
      // Execute the fetch request, and cast the results to an array of LogItem objects 
     var error:NSError? 
     if let fetchResults = appDelegate.managedObjectContext!.executeFetchRequest(fetchRequest, error: &error) as [AnyObject]? { 
      if let e = error{ 
       println(e.debugDescription) 

      } 

      if single { 
       var object: AnyObject? = fetchResults.first 

       return object; 
      } 
      else{ 
       return fetchResults 
      } 
     } 
    return nil; 
    } 

回答

3

尝试%K,而不是%@了属性名称。 像这样:

let predicate = NSPredicate(format: "%K == %@", "id","553178666d61d70c24fe4221") 

来源:Predicates Syntax (developer.apple.com) 从文档:

格式字符串支持printf风格格式说明如%×(见格式字符串对象)。两个重要的格式说明符是%@%K

  • %@是对象值通常是一个字符串,数字或日期变种ARG取代。

  • %K是关键路径的var arg替换。