參考文章:Swift 4.1 遷移小技巧 —— CompactMap
Swift 4.1引入了compactMap
杉畜,這里簡單說一下來由和遷移技巧。
為什么要有CompactMap?
原因1:
舊版的flatMap有兩個功能:降維 和 過濾nil(違背了單一職責(zé)原則)
1.降維
let arr = [[1, 2, 3], [4, 5]]
let newArr = arr.flatMap { $0 }
// newArr 的值為 [1, 2, 3, 4, 5]
2.過濾nil
let arr = [1, 2, 3, nil, nil, 4, 5]
let newArr = arr.flatMap { $0 }
// newArr 的值為 [1, 2, 3, 4, 5]
原因2:
除了違背單一職責(zé)原則叭莫,flatMap
還包含了隱藏邏輯冤今。
對可選的二維數(shù)組進行flatMap
會得到什么結(jié)果呢?
let arr1 = [[1, 2, 3], [4, 5], nil]
let flatArr1 = arr1.flatMap{$0}
let arr2 = [[1, 2, 3], [4, 5]]
let flatArr2 = arr2.flatMap{$0}
print(flatArr1) //[[1, 2, 3], [4, 5]]
print(flatArr2) //[1, 2, 3, 4, 5]
顯而易見桥状,flatMap
隱藏了邏輯“如果是可選類型帽揪,過濾nil,不降緯辅斟;否則降維”
由此提出compactMap
转晰,以區(qū)分降維和過濾nil
compactMap
-> 過濾nil
flatMap
-> 降維
Swift 4.1遷移
升級Swift 4.1之后,會有大量flatMap is deprecated
的warning
只有過濾nil的flatMap
報警告士飒,所以進行全局的方法名替換不可取查邢。
遷移思路:重載系統(tǒng)方法 -> 使用xcode提供的refactor替換方法名
下面給出常用的flatMap
重載,包括Array
酵幕、Dictionary
和Set
extension Array {
func flatMap(_ transform: (Element) throws -> String?) rethrows -> [String] {
return []
}
func flatMap<ElementOfResult>(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult] {
return []
}
}
extension Set {
func flatMap(_ transform: (Element) throws -> String?) rethrows -> [String] {
return []
}
func flatMap<ElementOfResult>(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult] {
return []
}
}
extension Dictionary {
func flatMap(_ transform: ((key: Key, value: Value)) throws -> String?) rethrows -> [String] {
return []
}
func flatMap<ElementOfResult>(_ transform: ((key: Key, value: Value)) throws -> ElementOfResult?) rethrows -> [ElementOfResult] {
return []
}
}
extension Dictionary.Keys {
func flatMap(_ transform: (Key) throws -> String?) rethrows -> [String] {
return []
}
func flatMap<ElementOfResult>(_ transform: (Key) throws -> ElementOfResult?) rethrows -> [ElementOfResult] {
return []
}
}
extension Dictionary.Values {
func flatMap(_ transform: (Value) throws -> String?) rethrows -> [String] {
return []
}
func flatMap<ElementOfResult>(_ transform: (Value) throws -> ElementOfResult?) rethrows -> [ElementOfResult] {
return []
}
}
1.將extension
導(dǎo)入項目
2.選中flatMap
-> Refactor
-> Rename
3.將flatMap
改成compactMap
4.依次將重載方法改名扰藕,即可基本完成遷移
5.遷移完之后刪除重載方法
如果上面的重載方法覆蓋不了全部warning,應(yīng)該剩下不多了芳撒,手動點掉吧邓深。??
PS.
重載了泛型版本的flatMap
未桥,還要多寫一個String
版本?
因為系統(tǒng)有個String
版本的flatMap
芥备,調(diào)用時會優(yōu)先調(diào)用指定類型flatMap
以上冬耿。