【问题标题】:Using Predicate in Swift在 Swift 中使用谓词
【发布时间】:2014-08-02 07:38:13
【问题描述】:

我正在为我的第一个应用完成教程(学习 Swift): http://www.appcoda.com/search-bar-tutorial-ios7/

我被困在这部分(Objective-C 代码):

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c]         %@", searchText];
    searchResults = [recipes filteredArrayUsingPredicate:resultPredicate];
}

谁能建议如何在 Swift 中为 NSPredicate 创建等效项?

【问题讨论】:

    标签: ios objective-c swift ios7 predicate


    【解决方案1】:

    这实际上只是一个语法切换。好的,所以我们有这个方法调用:

    [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
    

    在 Swift 中,构造函数跳过“blahWith...”部分,只使用类名作为函数,然后直接进入参数,因此[NSPredicate predicateWithFormat: …] 将变为NSPredicate(format: …)。 (再举一个例子,[NSArray arrayWithObject: …] 会变成 NSArray(object: …)。这是 Swift 中的常规模式。)

    所以现在我们只需要将参数传递给构造函数。在 Objective-C 中,NSString 字面量看起来像 @"",但在 Swift 中,我们只是对字符串使用引号。所以这给了我们:

    let resultPredicate = NSPredicate(format: "name contains[c] %@", searchText)
    

    事实上,这正是我们所需要的。

    (顺便说一句,您会注意到其他一些答案使用"name contains[c] \(searchText)" 之类的格式字符串。这是不正确的。它使用字符串插值,这与谓词格式不同,通常不适用于此。)

    【讨论】:

    • 谢谢。你救了我一天!
    • 要解决方法的第二行,您可以使用谓词:searchResults = recipes.filter { resultPredicate.evaluateWithObject($0) }
    【解决方案2】:

    长时间使用谓词。这是我的结论 (SWIFT)

    //Customizable! (for me was just important if at least one)
    request.fetchLimit = 1
    
    
    //IF IS EQUAL
    
    //1 OBJECT
    request.predicate = NSPredicate(format: "name = %@", txtFieldName.text)
    
    //ARRAY
    request.predicate = NSPredicate(format: "name = %@ AND nickName = %@", argumentArray: [name, nickname])
    
    
    // IF CONTAINS
    
    //1 OBJECT
    request.predicate = NSPredicate(format: "name contains[c] %@", txtFieldName.text)
    
    //ARRAY
    request.predicate = NSPredicate(format: "name contains[c] %@ AND nickName contains[c] %@", argumentArray: [name, nickname])
    

    【讨论】:

    • LIKE 'a%z' 等于什么?
    • @Jiří Zahálka 请求听到是什么意思?
    【解决方案3】:

    在 swift 2.0 中如何使用示例

    let dataSource = [
        "Domain CheckService",
        "IMEI check",
        "Compliant about service provider",
        "Compliant about TRA",
        "Enquires",
        "Suggestion",
        "SMS Spam",
        "Poor Coverage",
        "Help Salim"
    ]
    let searchString = "Enq"
    let predicate = NSPredicate(format: "SELF contains %@", searchString)
    let searchDataSource = dataSource.filter { predicate.evaluateWithObject($0) }
    

    你会得到(游乐场)

    【讨论】:

    • 如果...如果我有一个字典数组?如何解析获取数据?
    • @RevathyDurairajan 你需要 SELF.yourkeyname 来过滤字典数组。
    【解决方案4】:

    您可以使用 swift 中可用的过滤器来过滤数组中的内容,而不是像 Objective-C 中那样使用谓词。

    Swift 4.0 中的一个例子如下:

    var stringArray = ["foundation","coredata","coregraphics"]
    stringArray = stringArray.filter { $0.contains("core") }
    

    在上面的例子中,由于数组中的每个元素都是一个字符串,你可以使用contains方法来过滤数组。

    如果数组包含自定义对象,则该对象的属性可用于类似地过滤元素。

    【讨论】:

      【解决方案5】:

      使用下面的代码:

       func filterContentForSearchText(searchText:NSString, scopes scope:NSString)
      {
          //var searchText = ""
      
          var resultPredicate : NSPredicate = NSPredicate(format: "name contains[c]\(searchText)", nil)
      
          //var recipes : NSArray = NSArray()
      
          var searchResults = recipes.filteredArrayUsingPredicate(resultPredicate)
      }
      

      【讨论】:

      • 由于某种原因,这样写它对我不起作用,但是做 let myPredicateString = "name contains[c](searchText)" 然后做 var resultPredicate : NSPredicate = NSPredicate(format:myPredicateString)做了
      【解决方案6】:

      我认为这将是在 Swift 中执行此操作的更好方法:

      func filterContentForSearchText(searchText:NSString, scope:NSString)
      {
         searchResults = recipes.filter { name.rangeOfString(searchText) != nil  }
      }
      

      【讨论】:

      • 如果您要过滤 Sequence,这会更惯用,但在某些情况下您需要 NSPredicate,例如在处理 NSFetchedResultsController 时。
      【解决方案7】:

      在 swift 2.2 中

      func filterContentForSearchText(searchText: String, scope: String) {
          var resultPredicate = NSPredicate(format: "name contains[c]         %@", searchText)
          searchResults = (recipes as NSArray).filteredArrayUsingPredicate(resultPredicate)
      }
      

      在 swift 3.0 中

      func filterContent(forSearchText searchText: String, scope: String) {
              var resultPredicate = NSPredicate(format: "name contains[c]         %@", searchText)
              searchResults = recipes.filtered(using: resultPredicate)
          }
      

      【讨论】:

        【解决方案8】:

        // 根据您的数组数据更改“名称”和“值”。

        // 根据您的数组(NSArray)更改“yourDataArrayName”名称。

            let resultPredicate = NSPredicate(format: "SELF.name contains[c] %@", "value")
        
            if let sortedDta = yourDataArrayName.filtered(using: resultPredicate) as? NSArray {
        
         //enter code here.
        
                print(sortedDta)
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多