透過第三方套件 CodableCSV 解析 csv

Patty
6 min readAug 15, 2022

實作練習熟悉解析 csv 的流程,本篇作為自己日後忘記時可以複習的筆記

流程

  1. 加入 csv 檔至 App 的 Assets
  2. 透過 SPM(Swift Package Manager) 安裝套件 CodableCSV
    參考:使用 SPM 安裝第三方套件 — 以抓圖套件 Kingfisher 為例
  3. 自訂型別
  4. 解析
  5. 應用

實作

本篇解析音檔的相關資訊(csv),應用於內建時鐘的計時器分頁選擇鈴聲時試聽

【檢視 csv 檔欄位名稱】

ringtones.csv

【自訂型別】

import Foundation
import UIKit
import CodableCSV
struct Sound: Codable, Equatable {
var soundFileFullName: String
var soundFile: String
var sounfFileExtension: String
var soundName: String
}

補充:

Sound 遵從 Equatable 是之後需要判斷是否相同的方法 .firstIndex(of:)

class EditTimerSoundTableViewController: UITableViewController {
let ringtonesList = Sound.data
var ringtone: Sound
var selectIndex: Int
var player: AVPlayer?

// MARK: - init
init?(coder: NSCoder, ringtone: Sound){
self.ringtone = ringtone
self.selectIndex = ringtonesList.firstIndex(of: ringtone) ?? 0
super.init(coder: coder)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

【解析】

擴充自訂型別則之後可以直接使用 csv 檔的資訊

extension Sound {
static var data: [Self] {
var array = [Self]()
if let data = NSDataAsset(name: "ringtones")?.data {
let decoder = CSVDecoder {
$0.headerStrategy = .firstLine // 第一行為欄位名稱
}
do {
array = try decoder.decode([Self].self, from: data)
} catch {
print(error)
}
}
return array
}
}

【應用】

〖使用 csv 內容〗

let ringtonesList = Sound.data

〖表格資料〗

// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return ringtonesList.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "\(SoundTableViewCell.self)", for: indexPath) as? SoundTableViewCell else { return UITableViewCell() }
let row = indexPath.row
cell.soundLabel.text = ringtonesList[row].soundName
cell.accessoryType = row == selectIndex ? .checkmark : .none
return cell
}

〖選取表格的列播放鈴聲試聽〗

透過 AVPlayer 播放
- 來源選擇 ringtones.csv 的欄位 soundFile
- 副檔名為 ringtones.csv 的欄位 sounfFileExtension

// MARK: - Table view delegate
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectIndex = indexPath.row
ringtone = ringtonesList[selectIndex]

if let url = Bundle.main.url(forResource: Sound.data[selectIndex].soundFile, withExtension: Sound.data[selectIndex].sounfFileExtension){
player = AVPlayer(url: url)
player?.play()
}

tableView.reloadData()
tableView.deselectRow(at: indexPath, animated: true)
}

參考

AVPlayer

--

--