Swift过滤器对象数组

时间:2015-06-05 19:01:59

标签: swift

class book{
    var nameOfBook: String!
}

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

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

调用过滤器

7 个答案:

答案 0 :(得分:38)

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

答案 1 :(得分:11)

对不起,这是一个旧帖子。稍微更改代码以正确初始化变量'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")]

数组的'filter'函数接受一个参数和一些逻辑,'contains'函数可以采用您正在搜索的字符串的最简单形式。

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"]

以上两个片段可以像这样简写:

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

答案 2 :(得分:3)

SWIFT 4.0

为了过滤对象并获取结果数组,您可以使用此

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

答案 3 :(得分:2)

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 }
   }
}

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

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

要做你想做的事:

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

答案 6 :(得分:0)

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

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