【问题标题】:Swift filter array of objectsSwift过滤对象数组
【发布时间】:2015-06-05 19:01:59
【问题描述】:
class book{
    var nameOfBook: String!
}

var englishBooks=[book(),book(),book()]
var arr = englishBooks.filter {
    contains($0.nameOfBook, "rt")
}

我正在使用此过滤器,但出现错误无法使用参数调用过滤器

【问题讨论】:

    标签: swift


    【解决方案1】:

    contains() 检查序列是否包含给定元素,例如 如果String 包含给定的Character。

    如果您的意图是查找名称包含子字符串“rt”的所有书籍,那么您可以使用rangeOfString():

    var arr = englishBooks.filter {
        $0.nameOfBook.rangeOfString("rt") != nil
    }
    

    或用于不区分大小写的比较:

    var arr = englishBooks.filter {
        $0.nameOfBook.rangeOfString("rt", options: .CaseInsensitiveSearch) != nil
    }
    

    从 Swift 2 开始,您可以使用

    nameOfBook.containsString("rt") // or
    nameOfBook.localizedCaseInsensitiveContainsString("rt")
    

    在 Swift 3 中是

    nameOfBook.contains("rt") // or
    nameOfBook.localizedStandardContains("rt") // or
    nameOfBook.range(of: "rt", options: .caseInsensitive) != nil
    

    【讨论】:

      【解决方案2】:

      对不起,这是一个旧线程。稍微更改代码以正确初始化变量“nameOfBook”。

      class book{
         var nameOfBook: String!
         init(name: String) {
            nameOfBook = name
         }
      }
      

      然后我们可以创建一个书籍数组。

      var englishBooks = [book(name: "Big Nose"), book(name: "English Future 
      Prime Minister"), book(name: "Phenomenon")]
      

      数组的“过滤器”函数接受一个参数和一些逻辑,“包含”函数可以采用您正在搜索的字符串的最简单形式。

      let list1 = englishBooks.filter { (name) -> Bool in
         name.contains("English")
      }
      

      然后您可以像这样打印出 list1:

      let list2 = arr1.map({ (book) -> String in
         return book.nameOfBook
      })
      print(list2)
      
      // print ["English Future Prime Minister"]
      

      以上两个sn-ps可以简写成这样:

      let list3 = englishBooks.filter{ ($0.nameOfBook.contains("English")) }
      print(list3.map({"\($0.nameOfBook!)"}))
      

      【讨论】:

        【解决方案3】:

        SWIFT 4.0

        为了过滤对象并得到结果数组,你可以使用这个

        self.resultArray = self.upcomingAuctions.filter {
                            $0.auctionStatus == "waiting"
                        }
        

        【讨论】:

          【解决方案4】:

          如果您想从对象数组(匹配项)中删除具有特定 ID(matchIDsToDelete)的对象区间

          var matches = [Match]
          var matchIDsToDelete = [String]
          matches = matches.filter { !matchIDsToDelete.contains($0.matchID) }
          

          【讨论】:

            【解决方案5】:

            2020 | SWIFT 5.1:

            简短回答:

            books.filter { $0.alias.range(of: filterStr, options: .caseInsensitive) != nil }

            长样本:

            public filterStr = ""
            
            public var books: [Book] = []
            public var booksFiltered: [Book] {
               get {
                  (filterStr.isEmpty )
                     ? books
                     : books.filter { $0.alias.range(of: filterStr, options: .caseInsensitive) != nil }
               }
            }
            
            

            【讨论】:

              【解决方案6】:

              我认为这对于没有错误输入的情况更有用。

              englishBooks.filter( { $0.nameOfBook.range(of: searchText, options: .caseInsensitive) != nil}
              

              【讨论】:

                【解决方案7】:

                在 Swift 4.2 中使用 remove(where:) 功能。 filter isn't doing well with memory, remove(where:) 做得更好。

                做你想做的事:

                englishBooks.removeAll { !$0.nameOfBook.contains("English") }
                

                【讨论】:

                  猜你喜欢
                  • 2018-04-08
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-05-19
                  • 2019-02-27
                  • 1970-01-01
                  • 2019-12-13
                  • 1970-01-01
                  • 2020-10-01
                  相关资源
                  最近更新 更多