Arrayを複数回す際に役立ちそうなこと


2つのArrayを回して値を取り出したい
アプリの履歴管理とかはstructでまとめてArrayにするのが定石だけど
例えばファイルをリネームするときにわざわざstructを作りたくないのでタプルで回す

普通にやると

let items = try! FileManager.default.contentsOfDirectory(atPath: path)
let renamedItems = items.map{$0.replace("aaa",with:"bbb")}
let tuples = [(String,String)]
for i in items.count-1 {
   tuples.append(items[i], renamedItems[i])
}
tuples.forEach{
   ...
}

となり少し冗長、できればループはメソッドチェーンでやりたい。

タプルで回す

Arrayにextensionで実装


extension Array{
    func tupled<T>(_ items:[T])->[(Element,T?)]{return self.enumerated().map{($1,items.index(at: $0))}}
    func index(at index:Int)->Element?{return index >= 0 && index < self.count ? self[index] : nil}
}


let items = try! FileManager.default.contentsOfDirectory(atPath: path)
let renamedItems = items.map{$0.replace("aaa",with:"bbb")}
items.tupled(renamedItems).forEach{atPath,toPath in
    guard let toPath = toPath else {return}
    try! FileManager.default.moveItem(atPath: atPath, toPath: toPath)
}

満足...  (スナネコ)