TIL_20180205 ~ 20180209
05 Feb 2018 | TIL2018.02.05 ~ 06
(๊ณ์ ์ํ๊ธฐ ๋ฏธ์ ์ฝ๋ฉ๋ง ํ๋ค) TIL ์ํ๊ธฐ๋ฏธ์ vendingMachine, stockController์ฑ ์ ๋ถ๋ฆฌ stock / showcase ๊ฐ์ฒด ์์ฑ - BeverageDisplayStand ํ๋กํ ์ฝ ๊ตฌํ
- vendingmachine ์์ ์๋ฃ๋ฅผ ์ฌ๋ ๋์์ ํ๋ buy()๋ฉ์๋ - stockController์์์ removeItem()
- ๋์ ๋๋ฆฌ์์ ๋ฐธ๋ฅ๊ฐ mutate๋์ง ์๋ ๋ฌธ์ ๊ฐ ์์์!
- ๋์ ๋๋ฆฌ์์ key๊ฐ์ผ๋ก ์ ๊ทผํ ๋ ๋ฐธ๋ฅ๊ฐ ์ต์ ๋์ด๋ผ ๊ทธ๋ฐ๊ฑด์ง ์๋์ฒ๋ผ ์ผ๋ฐ for๋ฌธ / if๋ฌธ์ผ๋ก ์ ๊ทผํ๋๊น set.key == itemCode๋ถ๋ถ์์๋ ๋์ํ๋๋ฐ ๋ฆฌํด๋๋ self.stock์ ๊ทธ๋๋ก์์
// Before
mutating func removeItem(itemCode: ObjectIdentifier) -> [ObjectIdentifier: [Beverage]]{
var tempStock = self.stock
for var set in tempStock {
if set.key == itemCode {
historyLog.purchase.append(set.value[0])
set.value.remove(at: 0)
}
if set.key != itemCode {
print("์ฌ๊ณ ๊ฐ ์๋ ์๋ฃ ์ ํ Error")
}
}
self.stock = tempStock
return self.stock
}
// After
mutating func buyItem(item: Beverage) -> [ObjectIdentifier: [Beverage]] {
//var tempStock = self.stock
var itemKey = ObjectIdentifier(type(of:item))
for var set in self.stock {
if set.key == ObjectIdentifier(type(of:item)) {
itemKey = set.key
break
// let removedB = set.value.popLast()
// print("๋ ๋๋ถ ์ ๊ฑฐ์ฑ๊ณต\(removedB!.description)")
// print(Stock(sortedItems: self.stock).description)
} else if set.key != ObjectIdentifier(type(of:item)) {
print("์์ loop")
//print(Stock(sortedItems: self.stock).description)
}
}
self.stock[itemKey]!.removeLast()
print(Stock(sortedItems: self.stock).description)
//self.stock = tempStock
return self.stock
}
- ์ ํํฐ์ฝ๋์ฒ๋ผ ObjectIdentifier๊ฐ ๋๊ฐ์ ํค๊ฐ์ ์ฐพ์์ ์ ์ฅํด๋๊ณ loop๋ฅผ ๋ค ๋ ๋ค์, ๋ฐ๋ณต๋ฌธ ๋ฐ์์ value์ ์ ๊ทผํ๊ณ ์ต์ ๋์ ํ์ด์ค์ผ ์ง์์ก๋คโฆ. ์ด๊ฑฐ๋๋ฌธ์ ๊ฑฐ์ ๋์๊ฐ ๋ ๋ฆผ ^^!ใ ใ ใ
2018.02.07 ~ 08
(๊ณ์ ์ํ๊ธฐ ๋ฏธ์ ์ฝ๋ฉ๋ง ํ๋ค)
- ์ด์ํ enum InputView์์ ์๋ฃ์ต์ ์ 1๋ฒ์ผ๋ก ์ ๋ ฅ๋ฐ์ผ๋ฉด, Product์ rawValue๋ก ๋งค์นญ. ๋ฐฉ๋ฒ์ enum๋ด์ matchKey()๋ก int๊ฐ์ ๋๊ฒจ์ ํด๋นํ๋ ํด๋์คํ์ ์ ObjectIdentifier๋ฅผ buy๋ฉ์๋์ ์ธ์๋ก ๋๊ธฐ๋ ค๊ณ ํ์. ์๋์ ์ผ์ด์ค๋ VendingMachineํด๋์ค ๋ฐ์ enum์ ์ ์ธํ๊ณ matchKey()๋ฅผ enum์์ ์ ์ธํ ์ํฉ ```Swift // VendingMachine.swift
import Foundation
// Class ๋ฐ์ enum enum Product: Int{ case ChocoMilk = 1 case BananaMilk case Coke case Coffee case DolceLatte case EnergyDrink
func matchKey(_ option: Int) -> ObjectIdentifier? {
switch option {
case 1: return ObjectIdentifier(type(of: Product.ChocoMilk))
case 2: return ObjectIdentifier(type(of: Product.BananaMilk))
case 3: return ObjectIdentifier(type(of: Product.Coke))
case 4: return ObjectIdentifier(type(of: Product.Coffee))
case 5: return ObjectIdentifier(type(of: Product.DolceLatte))
case 6: return ObjectIdentifier(type(of: Product.EnergyDrink))
default: return nil
}
} }
// testCode // enum ๋ด์ matchKey()๋ก ๋ฆฌํด๋ (์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ์๋ฃ์ ํ ์ต์ ์์ ์ํ) key- ObjectIdentifier๊ฐ๊ณผ ์ํ๊ธฐ๊ฐ ๋ณด์ ํ stock๋ด์ key-ObjectIdentifier์ ๊ฐ์ด ๊ฐ์์ง ๋น๊ตํ๊ณ ์ถ์์
func testMatchKey() { var stock = Beverage let energyDrink = EnergyDrink(brand: โ๋ ๋๋ถโ, weight: 350, price: 2000, name: โ๋ ๋๋ถโ, manufactured: โ20171010โ)
for _ in 0..<2 {
stock.append(energyDrink)
}
let vending = VendingMachine(stockItems: stock)
let productkeys = vending.stock.keys
let result = Product.matchKey(.EnergyDrink)
// ์ฌ๊ธฐ์ result๊ฐ function์ด์์......
// 1. let result = Product.matchKey(1) ์ด๋ฐ์์ผ๋ก ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ์๋์ ๊ฐ์ ์๋ฌ. ๋์ฒด ์ด๋ค ๊ฒฝ์ฐ์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ ใ
ใ
// Error: Instance member 'matchKey' cannot be used on type 'Product'; did you mean to use a value of this type instead?
} ``` - case 2 ์์ ์ผ์ด์ค์์๋ matchKey๋ฅผ ๋ด๊ฐ ์ํ๋๋๋ก ์ฌ์ฉํ ์๊ฐ ์์์.(ํ๋ผ๋ฏธํฐ์ Int๋ฅผ ์ธ์๋ก ๋๊ธฐ๋๊ฒ ์๋๋ผ enum case์ค ํ๋๋ฅผ ๋๊ฒจ์ผ ํ์..)๊ทธ๋ฆฌ๊ณ matchKey()๊ฐ Instance๋ฉค๋ฒ๋ผ์ Product enum์์ ์ธ ์ ์๋ค๊ณ ํจ. ๋ฐ๋ผ์ ์๋์ฒ๋ผ enum์ ์์ ๋ฃ๊ณ (matchKey()๊ฐ ์ธ์คํด์ค ๋ด์ ์กด์ฌํด์ผ๋๋ ์ค ์๊ณ ) ํ
์คํธ ์ฝ๋์์ ์ฌ์ฉํ๋ ๋ ์๋ฌ๊ฐ ๋จ!... ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ ๋์ํ๋คํ๋๋ผ๋ matchKey์ case๋ฌธ ์์์ ObjectIdentifier ํ์
ํ๋ผ๋ฏธํฐ๋ฅผ `Product.ChocoMilk`๋ก ์ด๋ ๊ฒ enumํ์
๊น์ง ์ ํด์ฃผ์ง ์์ผ๋ฉด, ๊ณ์ ambiguous์๋ฌ๊ฐ ๋จ. enum์์์๋ `ChocoMilk.self`๊ฐ ์๋จ
// ์ด๋ ๊ฒ enum์ ์์ ๋ฃ์ด๋ณด์๋ค
class VendingMachine {
enum Product: Int{
case ChocoMilk = 1
case BananaMilk
case Coke
case Coffee
case DolceLatte
case EnergyDrink
func matchKey(_ option: Int) -> ObjectIdentifier? {
switch option {
case 1: return ObjectIdentifier(type(of: Product.ChocoMilk))
case 2: return ObjectIdentifier(type(of: Product.BananaMilk))
case 3: return ObjectIdentifier(type(of: Product.Coke))
case 4: return ObjectIdentifier(type(of: Product.Coffee))
case 5: return ObjectIdentifier(type(of: Product.DolceLatte))
case 6: return ObjectIdentifier(type(of: Product.EnergyDrink))
default: return nil
}
}
}
}
// testCode
func testMatchKey() {
var stock = [Beverage]()
let energyDrink = EnergyDrink(brand: "๋ ๋๋ถ", weight: 350, price: 2000, name: "๋ ๋๋ถ", manufactured: "20171010")
for _ in 0..<2 {
stock.append(energyDrink)
}
let vending = VendingMachine(stockItems: stock)
let productkeys = vending.stock.keys
let result = VendingMachine.Product.matchKey(1)
// error : Instance member 'matchKey' cannot be used on type 'VendingMachine.Product'; did you mean to use a value of this type instead?
}
ใ ใ ใ ใ ใ ํ ์ค๋์ ์ง์ง ์ด์ํ ๋ ์ด๋ค. ์ง๊ธ ๋ ๋ฒจ2 ๋ง์ง๋ง ๋ฏธ์ ์ ํผ์์ ํด๋ณด๊ณ ์๋๋ฐ, ๊ผฌ์ด๋๊ฒ ๋๋ฌด ๋ง๊ณ ์ฌ๊ธฐ์ ์ด๋ ๊ฒ ํด๋์ผ๋ฉด ์ ๊ธฐ์ ์ ๋ ๊ฒ์ง์ ์ฐ๊ฒฐํด์ผ์ง! ํ๊ณ ์ค๊ณํ๋๋ฐ ์๊ฐ์น๋ ๋ชปํ ๊ณณ์์ ๋ ๋ณต์กํ ๊ตฌํ์ด ํ์ํ๊ณ . ๋ ์ด๋ค๊ฑด ์์ ์ ๋ค ๋ฐฐ์ด๊ฑด๋ฐ๋ ์๊ฐ์ด ์๋์ ๋ฐ๋ก๋ฐ๋ก ์ ์ฉํ๊ธฐ๊ฐ ํ๋ค์๋ค. ๊ฒ์์ ํด๋ ์๋ฃจ์ ์ด ๋ ์ค๋ฅด์ง ์์๋ค. ์ค๋์ ๋ญ๊ฐ ์ฝ๋ฉํ๋๊ฒ ๋๊ฒ ๋ฒ๊ฑฐ์ ๋ค.
์ฝ๋์ค์ฟผ๋์์ ์์๋, ๋ชจ๋ฅด๋๊ฒ ์์ผ๋ฉด ๋ฉค๋ฒ๋ค์ด๋ JK์๊ฒ ์ง๋ฌธํด์ ํด๊ฒฐํด์๋ค. ๊ทธ๋ฆฌ๊ณ ๋จ๊ณ๋ณ๋ก PR์ ๋ณด๋ด๋ฉด ๊ฐ์ ์ฌํญ๊ณผ ๋ฐฉ๋ฒ์ ๋ํ ํํธ๊ฐ ํผ๋๋ฐฑ์ผ๋ก ์ค๋๊น, ์ฐจ๊ทผ์ฐจ๊ทผํด๋๊ฐ๋ ๊ฒ ๊ฐ์ ๊ธฐ๋ถ์ด ๋ค์ด์ ๋ด๊ฐ ๋ด์ค๋ ฅ๋๋ก ํด๋๊ฐ๋๊ตฌ๋ ๋ผ๋ ์ฐฉ๊ฐ์ ํ๋๊ฒ ๊ฐ๋ค. ์ฌํ๊น์ง ๊ทธ๋ ๊ฒ ํด์๋๊ฒ ๊ณผ์ฐ ๋ด๊ฐ ์๊ณ ํ๊ฑด๊ฐ์ถ๋ค. ๋๊ตฐ๊ฐ์ ๋์ ์์ด๋ ํด๊ฒฐ์ ์ ๋ชปํ๋๊ฒ ๊ฐ์์ ์ฐ์ธํด์ก๊ณ , ์ค๋์ ๋๋ค ์ค๋ฒ ์์ ์นด์ฝ๋ฅผ ํ๋๋ฐ ์คํ๋ฒ ์ค์์ xcodeํ๋ฉด ๋ณด๋ค๊ฐ ์ง์ง ๋๋ฌผ์ด ๋์ค๋ ค๊ณ ํ๋คใ ใ ใ ใ ์ง๊ธ ์ค์ํํธ๋ก ๋ ๋ฒจ2๋ฅผ 3๊ฐ์๋์๋ฐฐ์ ๋๋ฐ, ์๋ ํ๋ ํ์์ ํฌ๊ฒ ๋ฒ์ด๋์ง ์๋ ๋ฏธ์ ๋ ํผ์ ํด๊ฒฐ ๋ชปํ๊ณ โฆ ๋๊ตฐ๊ฐ์ ๊ฐ์ด๋๊ฐ ์์ผ๋ฉด ๋ ์ง์ง ์๋๋๊ฑด๊ฐ ์ถ์ด์ ๋๋ฌด ์์ํ๋ค. ํ์๊ฐ์์ผ๋ฉด ์ง์ง ์ด๋ฐ ๊ธ ๋์ ์ด๊ณ ์ฐ์ธํดํ ์๊ฐ์ ํ๋๋ผ๋ ๋ ํด๋ณด์ฃ! ํ๊ณ xcode์คํํด์ ๋๋๊ฑฐ ์๋๋๊ฑฐ ๋ค ์จ๋ณด๊ณ ๊ทธ๋ฌ์๋๋ฐ. ์ค๋์ ๋ญ๊ฐ ๊ทธ๋ด ํ๋ ์๋๋ณด๋คใ ใ ใ
2018.02.09
๋ฐฉํ๊ฒธ ๊ธฐ๋ถ์ ํ ๊ฒธ ์ ์ ์ฌ๋ฌ ๋ํด๋กใ ใ ..!
Comments