延續前兩天的問題,因為我有一個 Table View 顯示了各種飲料清單,而使用者可以選擇飲料後,傳入購物車的 Table View,這之間需要利用『陣列』傳值,所以我稍微再研究了一下陣列及字典的使用方法,也把自己思考邏輯整理一下。
假設我們有四種飲料要賣
先把這四種飲料放進一個[String]的陣列
var teaName = ["茉莉綠茶", "阿薩姆紅茶", "四季春茶", "黃金烏龍"]
另外假設這四個飲料都還沒有人訂,所以訂購數量都是0,也把它傳入另外一個數字陣列
var teaCount = [0, 0, 0, 0]
如果今天有人購買一杯"四季春茶",我們就變更 teaCount[2] = 1
var teaCount = [0, 0, 1, 0]
因為購物車不需要顯示沒有訂購的項目,所以利用forEach來判別陣列裡每個值
var teaCountInCart: [Int] = []
teaCount.forEach { count in
if count > 0 {
teaCountInCart.append(count)
}
}
// teaCountInCart變成[1]
PS: .forEach後面用的是一個尾隨閉包的概念,忘記的人去翻翻前面的語法喔!!
好棒棒!!陣列只保留我們要的了!!?
看起來好像對?但是我們不知道飲料名稱啊??
如果使用index(of: )的方法可以用值反查索引值,但是萬一有重複的值,他也只會在找到第一筆匹配的索引值就回傳了,Ex
var teaCount = [0, 0, 1, 1]
teaCount.index(of: 1) //回傳值2
總不可能叫客戶不同產品只能買不同杯吧!!?
既然名稱和數量分開的陣列無法對應,那我們直接把兩個關聯起來不就好了!?
沒錯!!就是 swift 裡面的字典!!
一樣,假設我們有四種飲料要買,初始購買量分別為0杯
var teaList = ["茉莉綠茶": 0, "阿薩姆紅茶": 0, "四季春茶": , "黃金烏龍": 0]
假設今天有人買了兩杯綠茶,一杯紅茶,兩杯青茶
teaList["茉莉綠茶"] = 2
teaList["阿薩姆紅茶"] = 1
teaList["四季春茶"] = 2
字典一樣有forEach的方法,只是回傳的值有 key 和 value ,因為 tableview 是表格行數來決定顯示資料的,所以我這邊也故意將字典轉換成兩個陣列,方便後面 tableview 要調用資料
var teaNameInCart: [String] = []
var teaCountInCart: [Int] = []
teaList.forEach { teaList in
if teaList.value != 0 {
teaNameInCart.append(d.key)
teaCountInCart.append(d.value)
}
}
// teaNameInCart is ["茉莉綠茶", "阿薩姆紅茶", "四季春茶"]
// teaCountInCart is [2, 1, 2]
完成!!
字典裡面的 value 資料型態不限定是單一資料,也可以是陣列、甚至是字典,我們來看看會變成怎樣
var teaNameInCart: [String] = []
var teaCountInCart: [[String: Int]] = [] //資料型態也要改成裡面是字典的陣列
var teaList = ["茉莉綠茶": ["無糖": 0, "少糖": 0], "阿薩姆紅茶": ["無糖": 0, "少糖": 0], "四季春茶": ["無糖": 0, "少糖": 0], "黃金烏龍": ["無糖": 0, "少糖": 0]]
// 客人買了一杯無糖綠茶
teaList["茉莉綠茶"] = ["無糖": 1, "少糖": 0]
teaList.forEach { d in
if d.value != ["無糖": 0, "少糖": 0] {
teaNameInCart.append(d.key)
teaCountInCart.append(d.value)
}
}
teaNameInCart // ["茉莉綠茶"]
teaCountInCart // [["無糖": 1, "少糖": 0]]
兩個問題要注意
teaCountInCart 資料型態也要改成裡面是字典的"陣列",把字典包在陣列的原因是我們需要指定的索引值!!字典本身是沒有排列順序的,如果沒有索引值,我們就不能把飲料名稱和飲料數量做關聯了
teaCountInCart 回傳的資料還是字典,裡面還有一個少糖": 0 的資料是我們不要的,必要的話還要再繼續判斷
我自己的解法如下:(順便讓客戶追加烏龍無糖、烏龍少糖各一杯)
var teaNameInCart: [String] = []
var teaCountInCart: [[String: Int]] = []
var sugarSelected: [String: Int] = [:]
var teaList = ["茉莉綠茶": ["無糖": 0, "少糖": 0], "阿薩姆紅茶": ["無糖": 0, "少糖": 0], "四季春茶": ["無糖": 0, "少糖": 0], "黃金烏龍": ["無糖": 0, "少糖": 0]]
teaList["茉莉綠茶"] = ["無糖": 1, "少糖": 0]
teaList["黃金烏龍"] = ["無糖": 1, "少糖": 1]
teaList.forEach { teaList in
if teaList.value != ["無糖": 0, "少糖": 0] {
teaNameInCart.append(teaList.key)
sugarSelected = teaList.value
sugarSelected.forEach { sugarSelected in
if sugarSelected.value != 0 {
teaCountInCart.append([sugarSelected.key : sugarSelected.value])
}
}
}
}
teaNameInCart // ["黃金烏龍", "茉莉綠茶"]
teaCountInCart [["無糖": 1], ["少糖": 1], ["無糖": 1]]
teaNameInCart索引值0 是"黃金烏龍"
teaCountInCart索引值0 是["無糖": 1], ["少糖": 1]
teaNameIncart索引值1 是"茉莉綠茶"
teaCountInCart索引值1 是["無糖": 1]
後面要讀取資料就很方便了~