今回は csv
からデータを取得する方法をメモ程度に残しておきます。
それではやっていく
下記のような、お酒の情報が並んだ liquors.csv
ファイルからデータを取得していきたいと思います。
ビール1缶,5,350 ビール1缶,5,500 チューハイ1缶,5,350 チューハイ1缶,5,500 ハイボール1缶,7,350 ハイボール1缶,7,350 ワイン1杯,12,120 清酒1合,15,180 焼酎コップ1杯,15,100 ウイスキーシングル1杯,40,30 テキーラシングル1杯,40,30 ブランデーシングル1杯,45,30
ということで下記が完成したコードになります👷♀️
func liquors() -> [Liquor] { guard let path = Bundle.main.path(forResource:"liquors", ofType:"csv"), let csvString = try? String(contentsOfFile: path, encoding: String.Encoding.utf8) else { return [] } let liquors = csvString.components(separatedBy: .newlines).compactMap { line -> (name: String, alcoholContent: Float, milliliter: Float)? in let component = line.components(separatedBy: ",") guard let name = component[safe: 0], let alcoholContent = component[safe: 1], let milliliter = component[safe: 2] else { return nil } return Liquor(name: name, alcoholContent: alcoholContent, milliliter: milliliter) } return liquors }
components
で取得した値は万が一の場合を考えてオプショナルで取得しています。このように配列の要素をオプショナルで取得したい状況は結構あるので Array
の Extension
に追加しておくとん便利です。
extension Array { public subscript (safe index: Index) -> Element? { return indices.contains(index) ? self[index] : nil } }
という感じで本日も以上になります🍺