實作練習熟悉解析 csv 的流程,本篇作為自己日後忘記時可以複習的筆記
流程
- 加入 csv 檔至 App 的 Assets
- 透過
SPM
(Swift Package Manager) 安裝套件CodableCSV
參考:使用 SPM 安裝第三方套件 — 以抓圖套件 Kingfisher 為例 - 自訂型別
- 解析
- 應用
實作
本篇解析音檔的相關資訊(csv),應用於內建時鐘的計時器分頁選擇鈴聲時試聽
【檢視 csv 檔欄位名稱】

【自訂型別】
import Foundation
import UIKit
import CodableCSVstruct 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