假設我有以下內容
let ids = mySet.lazy.map { $0.id }
ids.contains(...)
該.contains()功能是否使lazy冗余?我假設它必須完成map對整個的mySet是能夠執行contains()?還是我錯了?
uj5u.com熱心網友回復:
你錯了。
添加.lazy會導致 map 回傳 aLazyMapSequence而不是Array。當您呼叫.containsthis 時LazyMapSequence,它將在.contains檢查每個元素時執行映射操作。
假設您的集合有 100 個專案。 .contains找到您要搜索的專案后立即退出,因此如果您很幸運并且您的第一個專案Set滿足.contains,那么只有該專案將被.mapped 并.contains立即回傳true。
請注意,Sets 是無序的,因此它的搜索順序是未指定的。
在操場上試試這個:
struct Person : Hashable {
var id: Int
var name: String
}
let mySet = Set([Person(id: 1, name: "Joe"),
Person(id: 2, name: "Abhijit"),
Person(id: 3, name: "Fred")])
let ids = mySet.lazy.map { (person) -> Int in print("mapped \(person)"); return person.id }
print(ids.contains(1))
觀察輸出。當我嘗試時,我得到:
mapped Person(id: 1, name: "Joe") true
然后洗掉.lazy并再次運行它。我有:
mapped Person(id: 1, name: "Joe") mapped Person(id: 3, name: "Fred") mapped Person(id: 2, name: "Abhijit") true
因此.lazy無需.map在每個專案上運行。如果.contains找到了它要找的東西,那么就沒有必要.map對每個專案都運行。
注意:如果Set不包含您要搜索的專案,則每個專案都將被訪問和.mapped.contains才能回傳false。
現在如果多次呼叫 contains 呢?是否必須再次從“未映射”序列開始?或者它是否會將先前映射的值存盤在某處?
的第二個效果lazy是不使用存盤來保存中間映射值。所以contains多次呼叫會為每個訪問的設定值再次執行映射操作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/395133.html
上一篇:SwiftDispatchQueue全域變數和主要變數
下一篇:洗掉這些物件的最有效方法
