Swift筛选对象数组

43
class book{
    var nameOfBook: String!
}

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

我正在使用这个过滤器,但出现错误“无法调用带有参数的过滤器”

7个回答

51

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

17

对不起,这是一个旧的主题。稍微更改您的代码以正确初始化变量'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:

然后,您可以像以下方式一样打印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!)"}))

8

SWIFT 4.0

为了过滤对象并获取结果数组,您可以使用以下代码:

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

5

如果您想从一个对象数组(matches)中删除具有特定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 }
   }
}


4
我认为这对于避免错误输入的情况更有用。
englishBooks.filter( { $0.nameOfBook.range(of: searchText, options: .caseInsensitive) != nil}

2
在Swift 4.2中,使用remove(where:)功能。 filter对内存的处理效果不佳remove(where:)可以更好地完成工作。
要实现你想要的功能:
englishBooks.removeAll { !$0.nameOfBook.contains("English") }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接