๊ณต๋ถ€ ์—ฐ์Šต์žฅ :-)

TIL_20180226 ~ 20180302

|

2018.02.26

  • ์˜ค๋žœ๋งŒ์— ์ฝ”๋“œ์Šค์ฟผ๋“œ์—๊ฐ€์„œ ๊ฐ•์˜ ๋“ค์—ˆ๋‹ค!
    • 2์›”์— ํ˜ผ์ž ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๋‚˜๋งŒ ์Šฌ๋Ÿผํ”„์— ๋น ์ง„๊ฒƒ๊ฐ™๊ณ  ์ฝ”๋“œ๋ฆฌ๋ทฐ ์—†์ด ๋ฏธ์…˜์„ ์ง„ํ–‰ํ•˜๋Š”๊ฒŒ ๋‚˜๋งŒ ์–ด๋ ค์šด๊ฑฐ๊ฐ™๊ณ  ๋‚˜๋งŒ ๊ณต๋ถ€์•ˆํ•˜๋Š”๊ฒƒ๊ฐ™๊ณ  ๋Œ€ํ˜ผ๋ž€์˜ ์‹œ๊ธฐ๊ฐ€ ํ•œ๋ฒˆ ์™”์–ด์„œ, (์ผ๋ถ€๋Ÿฌ)๊ณต๋ถ€๊ณ„ํš์„ ๋” ๋ณต์Šต์— ์น˜์ค‘ํ•˜๋Š”๊ฑธ๋กœ ์ˆ˜์ •ํ•ด์„œ ์ง„ํ–‰ํ–ˆ๋‹ค. ์ด๋Ÿฐ์ €๋Ÿฐ ์ด์œ ๋กœ ๋งŽ์ด ์ž์‹ ๊ฐ์ด ์ €ํ•˜๋˜์–ด์žˆ์—ˆ๋Š”๋ฐ ์˜ค๋Š˜ ๋ฉค๋ฒ„๋“ค์„ ๋งŒ๋‚˜์„œ ์–˜๊ธธ ๋“ค์–ด๋ณด๋‹ˆ ๋‚˜๋งŒ ๊ทธ๋Ÿฐ๊ฒŒ ์•„๋‹Œ๊ฒƒ ๊ฐ™์•„์„œ ๋ญ”๊ฐ€ ๋™์งˆ๊ฐ์„ ๋Š๊ผˆ๋‹ค๊ณ ํ•ด์•ผํ•˜๋‚˜โ€ฆ ์•ž์œผ๋กœ๋งŒ ๋” ์ž˜ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ž์‹ ๊ฐ์„ ์กฐ๊ธˆ ์–ป์€ ๊ฒƒ ๊ฐ™๋‹ค.
    • ํ”„๋กœํ† ํƒ€์ž… ๊ฐ•์˜ : UX์— ๋Œ€ํ•ด ๊ฐœ๋ฐœ์ž๋กœ์„œ ์ƒ๊ฐํ•ด์•ผ ํ•  ๊ฒƒ๋“ค, ์ฃผ์˜ํ•ด์•ผํ• ๊ฒƒ๋“ค์— ๋Œ€ํ•ด ๋ฐฐ์› ๋‹ค. ๋””์ž์ด๋„ˆ์™€ ์กฐ์œจํ•˜๊ณ  ๊ณต์œ ํ•ด์•ผ ํ•  ๊ฒƒ๋“ค ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด์„œ ๊ฐœ๋ฐœ์ž๋Š” ์–ด๋–ค ๋ทฐ๋ฅผ ์ง€๋‹ˆ๊ณ ์žˆ์–ด์•ผํ•˜๋Š”์ง€ ๊นŠ๊ฒŒ ๊ณ ๋ฏผํ•ด๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ ๋ทฐ๊ฐ€ ์ž˜๋ชป๋˜๋ฉด ์‚ฌ์šฉ์ž์˜ ๋‹ˆ์ฆˆ์™€๋Š” ์ „ํ˜€ ๋ฐ˜๋Œ€๋œ ์•ฑ์ด ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

2018.02.27

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ํ—ฌ๋กœ์ฝ”๋”ฉ chapter6 ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰
      • ํ‚ค์›Œ๋“œ : ๊ทธ๋ž˜ํ”„, ์ •์ (node), ๊ฐ„์„ (edge), ํ,
  • ์ง€ํ‚ฌ ๋ธ”๋กœ๊ทธ ๋ฆฌํŒŒ์ง€ํ† ๋ฆฌ์— gitignore์ ์šฉ : ์•„์ง ๋ฏธ์™„์„ฑ๋œ ํฌ์ŠคํŠธ๋Š” ์ž๋™์œผ๋กœ ์ปค๋ฐ‹๋˜์ง€ ์•Š๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค! ๋„ˆ๋ฌด ํŽธํ•˜๊ณ  ์ข‹๋‹ค. ์—ญ์‹œ ๊ธฐ์ˆ ์ด๋ž€โ€ฆ!

  • ๊นƒํ—™ ์œ ์ €๋„ค์ž„๋ณ€๊ฒฝ
  • Apple ID ๋ณ€๊ฒฝํ•˜๊ธฐ

2018.02.28

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ํ•ด์ปค๋žญํฌ: Apple and Orange, Kangaroo(๋ญ”๊ฐ€ ๋˜๊ฒŒ ์–ด๋ ต๊ฒŒ ์ ‘๊ทผํ–ˆ๋Š”๋ฐ ์˜์™ธ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘ธ๋Š” ๋ฌธ์ œ์˜€๋˜๊ฒƒโ€ฆ)
    • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ํ’€๋•Œ ์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ์ตœ์†Œ๋‹จ์œ„๋ฅผ ์ฐพ์•„์„œ ์ ‘๊ทผํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.
    • ์Šค์œ„ํ”„ํŠธ์—์„œ์˜ Queue ๊ณต๋ถ€.
  • ๊นƒํ—™ ์œ ์ €์•„์ด๋”” ๋ณ€๊ฒฝ: ๋ญ”๊ฐ€ ์˜๋ฏธ์žˆ๋Š” ์•„์ด๋””๋กœ ๋ณ€๊ฒฝํ•˜๊ณ ์‹ถ์—ˆ๋Š”๋ฐ, iOS๊ฐœ๋ฐœ์ž๋ผ๋Š” ๋งฅ๋ฝ์—์„œ ์ƒˆ๋กœ ์ง€์€ ์œ ์ €๋„ค์ž„์„ ๋ฐ”๊ฟจ๋‹ค. github์ƒ์—์„œ ๋ณ€๊ฒฝํ•˜๊ณ  ๋กœ์ปฌ์—์„œ remote ์„ค์ •์„ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด๋œ๋‹ค. ์ƒ๊ฐ๋ณด๋‹ค ์—„์ฒญ ๊ฐ„๋‹จํ–ˆ๋‹ค!
    • ๋ณ€๊ฒฝํ•˜๊ณ  ์ง€ํ‚ฌ ๋ธ”๋กœ๊ทธ๋„ ๋ฆฌ๋ชจํŠธ ์ €์žฅ์†Œ ์ด๋ฆ„๋งŒ ์ƒˆ๋กœ์šด ์œ ์ €์•„์ด๋””๋กœ ๋ฐ”๊ฟ”์คฌ๋”๋‹ˆ ์ž˜ ์ ‘์†๋˜์—ˆ๋‹ค.
  • ์Šค์œ„ํ”„ํŠธ
    • if๋ฌธ์•ˆ์—์„œ range๋ฅผ ์ฒดํฌํ• ๋•Œ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜๋‹ค.
    • ~= ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ! ```swift // source // To check if a number is between a range, donโ€™t do if number >=0 && number <= 100 {

} // Use range and news operators instead : if 0โ€ฆ100 ~= number {

}


```swift
// Queue ์ฝ”๋“œ์—์„œ ์ดํ•ด ์•ˆ๊ฐ”๋˜ ๋ถ€๋ถ„ ์ •๋ฆฌ

public mutating func dequeue() -> T? {
    guard head < array.count, let element = array[head] else { return nil } // element๋Š” ์ด๋ฏธ array[head]์˜ ๊ฐ’์œผ๋กœ ๋ณต์‚ฌ๋จ

    array[head] = nil // ์œ„ ์ฝ”๋“œ์˜ element์™€๋Š” ๋‹ค๋ฆ„. element๋ฅผ ์ง€์›Œ์•ผ ํ•˜๋‹ˆ๊นŒ ๊ฐ™์€ ์ž๋ฆฌ(head์ž๋ฆฌ)์— nil ๋„ฃ์–ด์คŒ
    head += 1 // head๋Š” ํ•œ ์นธ ๋’ค๋กœ ์›€์ง์ž„

    let percentage = Double(head)/Double(array.count)
    if array.count > 50 && percentage > 0.25 { // ํ์˜ ์•ž๋ถ€๋ถ„์— ๋นˆ nil๊ฐ’์ด ๊ธฐ์ค€ ์ด์ƒ์ผ ๊ฒฝ์šฐ ์ง€์šฐ๋Š” ์กฐ๊ฑด ๋„ฃ์–ด์คŒ
      array.removeFirst(head) // ์•ž์—์„œ๋ถ€ํ„ฐ head๊นŒ์ง€ ์žˆ๋Š” nil์„ ์ง€์šฐ๊ณ 
      head = 0 // head๋ฅผ ๋‹ค์‹œ array์˜ ๋งจ ์ฒ˜์Œ ์ธ๋ฑ์Šค๋กœ ๋ฐ”๊ฟ”์คŒ
    }

    return element // guard let ๋ถ€๋ถ„์—์„œ ํ˜„์žฌ head์œ„์น˜์˜ ๋ณต์‚ฌ๋๋˜ ๋ฐธ๋ฅ˜ ๋ฆฌํ„ด
  }

2018.03.01

  • ์˜ค๋žœ๋งŒ์— ์žํŒ๊ธฐ๋ฏธ์…˜์œผ๋กœ ๋ณต๊ท€.
  • ์˜ค๋Š˜ ์ž‘์—…์œผ๋กœ ์žํŒ๊ธฐ ๊ธฐ๋ณธ ๋™์ž‘์€ ๋‹ค ๋Œ์•„๊ฐ€๋„๋ก ๋งŒ๋“ฆ. ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์•„๋ด์•ผ ์•Œ ๊ฒƒ ๊ฐ™๋‹ค.
    • addItem์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋˜ ๊ฒƒ ๊ณ ์นจ (์—‰๋šฑํ•œ ๋ฒˆํ˜ธ์˜ item์ด ์ œ๊ฑฐ๋˜๋Š” ํ˜„์ƒ์ด ์žˆ์—ˆ์Œ)
    • ์•Œ๊ณ ๋ณด๋‹ˆ ๋”•์…”๋„ˆ๋ฆฌ์—์„œ๋Š” ํ•ด๋‹น key์˜ value์— ํ‰์†Œ ์–ด๋ ˆ์ด์—์„œ ํ•˜๋˜๋Œ€๋กœ append๊ฐ€ ๋˜์ง€ ์•Š์•„์„œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์˜€๋‹ค. ์ƒˆ๋กœ์šด array๋ฅผ ๋ณต์‚ฌํ•ด์„œ ๊ทธ ๊ฐ’์œผ๋กœ replaceํ•ด์ค˜์•ผ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ์˜€๋‹ค. (์ฐธ๊ณ ๋งํฌ)
      if var arr = dict["key"] {
      arr.append(4)
      dict["key"] = arr
      }
      

2018.03.02

  • ๋ ˆ๋ฒจ3 ๊ณผ์ • ์˜ˆ์Šต.
    • ์•„๋ก ํž๋ฆฌ๊ฐ€์Šค์˜ iOSํ”„๋กœ๊ทธ๋ž˜๋ฐ chapter1 ๊ณต๋ถ€! ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์•„์ฃผ ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ๋งŒ ๋งŒ์ ธ๋ด์„œ ์–ด๋ ต์ง„ ์•Š์•˜์ง€๋งŒ ๋งค์šฐ ๋ฟŒ๋“ฏ๋ฟŒ. ๋“œ๋””์–ด ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์ผœ๊ณ  ์•ฑ์„ ๋งŒ์ง€๋Š” ๋Š๋‚Œ์ด ๋‚ฌ๋‹ค.
    • ๋„ˆ๋ฌด ์ฒซ๋‚ ๋ถ€ํ„ฐ ์ž๋ฃŒ์ฐพ๊ณ  ์ฑ… ๋ถ™๋“ค๊ณ  ์žˆ๋Š” ์‹œ๊ฐ„์ด ๋งŽ์„ ๊ฒƒ ๊ฐ™์•„ ๋ฏธ๋ฆฌ ์ข€ ์ฐพ์•„๋ณด๊ณ  ์ƒˆ๋กœ์šด xcodeํ™”๋ฉด์— ์ ์‘ํ•ด๋ณด๋ ค๊ณ  ์˜ˆ์Šตํ•จ

์Šค์œ„ํ”„ํŠธ_์ œ๋„ค๋ฆญ(Generic in Swift)

|

Swift Generic

์Šค์œ„ํ”„ํŠธ์˜ ์ œ๋„ค๋ฆญ์„ ์ด์šฉํ•ด์„œ ๋‹ค์–‘ํ•œ ํƒ€์ž…์ด ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
์ œ๋„ค๋ฆญ์€ ์ถ”์ƒํ™” ๋‹จ๊ณ„์—์„œ, ๋งŒ์•ฝ ์ฝ”๋“œ์— ๋™์ž‘ํ•˜๋Š” ๋กœ์ง์ด ๋˜‘๊ฐ™์€๋ฐ ์ ์šฉ๋ผ์•ผ ํ•  ํƒ€์ž…์ด ์—ฌ๋Ÿฌ๊ฐœ๋ฉด ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

Stack์„ ์ œ๋„ค๋ฆญ์œผ๋กœ ๋งŒ๋“ค๊ธฐ

// Element : placeholder type
struct Stack<Element> {
    var items = [Element]()

    mutating func push(_ newItem: Element) {
        items.append(newItem)
    }

    mutating func pop() -> Element? {
        guard !items.isEmpty else {
            return nil
        }
        return items.removeLast()
    }
}

// execute Stack<Int>
var intStack = Stack<Int>()
intStack.push(1)
intStack.push(2)
print(intStack.pop()) // Optional(2)

  • ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ๋œ Element๋Š” placeholderํƒ€์ž…์œผ๋กœ, ์ผ์ข…์˜ ์ž๋ฆฌ ๋งก๊ธฐ ํƒ€์ž… ์ด๋‹ค.
  • ์ œ๋„ค๋ฆญ์ด ์„ ์–ธ๋œ ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ฝ”๋“œ ํ•˜๋‹จ๋ถ€์˜ execute ๋ถ€๋ถ„์ฒ˜๋Ÿผ, ์‚ฌ์šฉํ•  ํƒ€์ž…์„ <>์•ˆ์— ๊ธฐ์žฌํ•ด์ค€๋‹ค.
    ๋งŒ์•ฝ ์˜ˆ์‹œ์ฒ˜๋Ÿผ Stack<Int>๋กœ ์„ ์–ธํ–ˆ๋‹ค๋ฉด, Stack๊ตฌ์กฐ์ฒด ์•ˆ์—์„œ Element๋กœ ์„ ์–ธ๋œ ๋ชจ๋“  ๋ถ€๋ถ„์ด Int๋กœ ์ ์šฉ๋˜์–ด์„œ ๋™์ž‘ํ•˜๊ฒŒ๋œ๋‹ค.

mapํ•จ์ˆ˜๋ฅผ ์ œ๋„ค๋ฆญ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

  • <T,U>: ์ž๋ฆฌ ๋งก๊ธฐ์šฉ ํƒ€์ž…, placeholder
  • _ items: [T]: ์ž…๋ ฅ(ํŒŒ๋ผ๋ฏธํ„ฐ)๋ฐฐ์—ด, ๋ฐฐ์—ด์˜ value์˜ ํƒ€์ž…์€ T
  • _ f: (T) -> (U): ํด๋กœ์ € ์„ ์–ธ๋ถ€๋กœ, Tํƒ€์ž…์˜ ์ธ์ˆ˜๋ฅผ ๋ฐ›์•„ Uํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค๋Š” ๋œป
  • -> [U]: ๋ฆฌํ„ด๊ฐ’์€ ๋ฐฐ์—ด, ๊ทธ ๋ฐฐ์—ด์˜ value ํƒ€์ž…์€ U
// f: ๋ถ€๋ถ„์€ ํด๋กœ์ € ์„ ์–ธ๋ถ€
func myMap<T,U>(_ items: [T], _ f: (T) -> (U)) -> [U] {
    var result = [U]()
    for item in items {
        result.append(f(item))
    }
    return result
}

// execute myMap()
let letters = ["one","two","three"]
let lengths = myMap(letters) { $0.count }
print(lengths) // [3,3,5]
  • ํ•ด๋‹น ์ฝ”๋“œ์—์„œ myMap()ํ•จ์ˆ˜๋Š” String๋ฐฐ์—ด์„ ๋ฐ›์•„์„œ ๊ฐ value์˜ ๊ธ€์ž ์ˆ˜๋ฅผ ์„ธ์–ด Int๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค.
  • myMapํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ๋•Œ ๊ด„ํ˜ธ ์•ˆ์— ๊ธฐ์žฌ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ letters๋Š” ํ•จ์ˆ˜ ์„ ์–ธ๋ถ€์—์„œ์˜ _ items: [T]๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • execute๋ถ€๋ถ„์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด, { $0.count }๊ฐ€ ๋ฐ”๋กœ ์œ„์—์„œ ์„ค๋ช…๋œ ํด๋กœ์ € ์„ ์–ธ๋ถ€์ด๋‹ค.
    • Stringํƒ€์ž…์ธ value๊ฐ๊ฐ์„ ๋œปํ•˜๋Š” $0์˜ .count -๋ฆฌํ„ด๊ฐ’์€ Int-๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ [U]ํƒ€์ž… ๋ฆฌํ„ด๊ฐ’์— ์ถ”๊ฐ€ํ•œ๋‹ค.

ํƒ€์ž… ์ œํ•œ ์กฐ๊ฑด

์ œ๋„ค๋ฆญ์€ ์–ด๋–ค ํƒ€์ž…๋„ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์•ž์œผ๋กœ ์‚ฌ์šฉ๋  ๊ตฌ์ฒด์  ํƒ€์ž…์„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ์ง€ ๋ชปํ•˜๋Š” ๊ฐœ๋ฐฉ์„ฑ๋•Œ๋ฌธ์— ์˜คํžˆ๋ ค ์‚ฌ์šฉ์—๋Š” ์ œํ•œ์ ์ธ ๋ฉด์ด ์žˆ๋‹ค. ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ๋‘ ๊ฐ€์ง€ ํƒ€์ž… ์ œํ•œ ์กฐ๊ฑด์„ ๋‘”๋‹ค.

  1. ํƒ€์ž…์€ ์–ด๋–ค ํด๋ž˜์Šค์˜ ์„œ๋ธŒ ํด๋ž˜์Šค๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค.
  2. ํƒ€์ž…์€ ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•ด์•ผํ•œ๋‹ค.

ํ•œ ๊ฐ€์ง€ ์˜ˆ์‹œ๋กœ, ๋”•์…”๋„ˆ๋ฆฌ์˜ Key๊ฐ’์ด ๋˜๋Š” ํƒ€์ž…์€ Hashable ํ”„๋กœํ† ์ฝœ์„ ๋ฐ˜๋“œ์‹œ ์ค€์ˆ˜ํ•ด์•ผํ•˜๋Š” ์กฐ๊ฑด์ด ์žˆ๋Š”๋ฐ, ์ด๋Š” ๋ฌผ๋ก  ์ œ๋„ค๋ฆญ์˜ ํƒ€์ž…์ œํ•œ์กฐ๊ฑด๋•Œ๋ฌธ์ด๋‹ค.
์ด๋Ÿฌํ•œ ํƒ€์ž…์ œํ•œ์กฐ๊ฑด์€ ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝœ๋ ‰์…˜๋“ค์ด ๋” ๊ฒฌ๊ณ ํ•ด์ง€๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ ๋‹ค. ๋”•์…”๋„ˆ๋ฆฌ์˜ Key๊ฐ€ Hashable ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•ด์•ผํ•˜๋Š” ์ œํ•œ ์กฐ๊ฑด์„ ๋‘ ์œผ๋กœ์จ ๋”•์…”๋„ˆ๋ฆฌ์˜ key๊ฐ’ ํ•˜๋‚˜ํ•˜๋‚˜๋Š” ๊ณ ์œ ํ•œ ๊ฐ’์ด ๋˜์–ด value๋“ค์„ ๋Œ€ํ‘œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š”๊ฒƒ์ด๋‹ค.

ํƒ€์ž… ์ œํ•œ ์กฐ๊ฑด์„ ์ ์šฉํ•˜์—ฌ ๋™์ผ์„ฑ ํŒ๋‹จ

  • ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ํƒ€์ž… T๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์ด ๊ฐ™์€์ง€ ํŒ๋‹จํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.
  • ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” placeholderํƒ€์ž…์€ <T: Equatable>์™€ ๊ฐ™์ด ์„ ์–ธํ•˜๋ฉด ๋˜๊ณ , ์ƒ์†์ผ๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค.
func checkEqual<T>(_ first: T, _ second: T) -> Bool  {
    return first == second
} // Error: Binary operator '==' cannot be applied to two 'T' operands

func newCheckEqual<T: Equatable>(_ first: T, _ second: T) -> Bool  {
    return first == second
}
  • ์ด ์ฝ”๋“œ์˜ ์œ„์ชฝ์— ์„ ์–ธ๋œ checkEqual() ํ•จ์ˆ˜๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. T๊ฐ€ ์–ด๋–ค ํƒ€์ž…์ด ์˜ฌ์ง€ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋น„๊ต์—ฐ์‚ฐ์ž๊ฐ€ ์ž‘๋™ํ•˜๋Š”์ง€ ์žฅ๋‹ดํ•  ์ˆ˜ ์—†์–ด์„œ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
  • newCheckEqual()์„ ๋ณด๋ฉด placeholder๋กœ T๊ฐ€ ์„ ์–ธ๋˜๊ธดํ–ˆ์ง€๋งŒ ๊ทธ T๋Š” Equatable์„ ์ค€์ˆ˜ํ•˜๋Š” ํƒ€์ž…๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋น„๊ต์—ฐ์‚ฐ์ž๊ฐ€ ์ž‘๋™ํ•  ๊ฒƒ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

ํƒ€์ž… ์ œํ•œ ์กฐ๊ฑด์„ ์ ์šฉํ•œ ๋™์ผ์„ฑ ํŒ๋‹จ ๋‘๋ฒˆ์งธ

  • ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•ด์„œ T,U ํƒ€์ž…์ด ๋‹ฌ๋ผ๋„ ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
func checkIfDescriptionMatch<T: CustomStringConvertible, U: CustomStringConvertible>(_ first: T, _ second: U) -> Bool  {
    return first.description == second.description
}

print(checkIfDescriptionMatch(Float(1.0), Double(1.0)))

TIL_20180219 ~ 20180225

|

2018.02.20

  • ํ—ฌ๋กœ์ฝ”๋”ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜ chapter4 ํ€ต์ •๋ ฌ / ์žฌ๊ท€ ๋ณต์Šต
    • ํ‚ค์›Œ๋“œ : ๋ถ„ํ• ์ •๋ณต, ๊ธฐ๋ณธ๋‹จ๊ณ„, ์žฌ๊ท€๋‹จ๊ณ„, ๊ธฐ์ค€์›์†Œ(pivot), ํ•˜์œ„๋ฐฐ์—ด
  • ์ธํ”„๋Ÿฐ ๊ถŒ์˜คํ ๊ต์ˆ˜๋‹˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ•์˜ : ์žฌ๊ท€๊ฐ€ ์–ด๋ ค์›Œ์„œ ๊ฐ•์˜๋กœ ๋„์›€์„ ๋ฐ›์œผ๋ ค๊ณ  ์ฐพ์•„๋ดค๋‹ค. ์žฌ๊ท€ ๋ถ€๋ถ„ ์ดˆ๋ฐ˜์„ ๋“ค์—ˆ๋Š”๋ฐ ๋„์›€์ด ๋งŽ์ด๋๋‹ค!
    • ์žฌ๊ท€๊ธฐ์ดˆ(ํŒฉํ† ๋ฆฌ์–ผ, ์ œ๊ณฑ),ํ€ต์ •๋ ฌ ์Šค์œ„ํ”„ํŠธ๋กœ ๊ตฌํ˜„
  • ํ•ด์ปค๋žญํฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ•œ๋ฌธ์ œ ํ’ˆ! (Lisaโ€™s Workbook๊นŒ์ง€ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ ์–ด๋ ค์›Œ์„œ ๋ฉ”๋‹ฌ๋ฆฌ๊ณ ์žˆ๋‹ค๊ฐ€, ์‹œ๊ฐ„์„ ๋„ˆ๋ฌด ์žก์•„๋จน๋Š”๊ฒƒ๊ฐ™์•„์„œ ๋ง‘์€ ์ •์‹ ์— ๋‹ค์‹œ ๋ณด๊ธฐ๋กœ! ๊ผญ ์ด๋Ÿฐ๊ฑด ๋‹ค์‹œ ๋ณด๋ฉด ์‹ค๋งˆ๋ฆฌ๊ฐ€ ์ƒ๊ฐ๋‚˜๋”๋ผ;)

2018.02.21

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ์–ด์ œ ํ—ฌ๋กœ์ฝ”๋”ฉ์—์„œ ๋ดค๋˜ ํ€ต์†ŒํŠธ ๋ณต์Šต/์ •๋ฆฌ
    • ํ—ฌ๋กœ์ฝ”๋”ฉ : ๋น…์˜ค ํ‘œ๊ธฐ๋ฒ• ๋ณต์Šต, chapter5 ํ•ด์‹œํ…Œ์ด๋ธ” ๊ธฐ๋ณธ๊ฐœ๋…, ํ•ด์‹œํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ
    • ํ•ด์‹œํ…Œ์ด๋ธ” ํ‚ค์›Œ๋“œ : key, value, ์บ์‹ฑ์€ ํ•ด์‹œํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•œ๋‹ค.
    • ํ•ด์ปค๋žญํฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€๊ธฐ - Grading Student, Breaking the records
  • ์Šค์œ„ํ”„ํŠธ ์ œ๋„ˆ๋ฆญ ๋ฆฌ๋ทฐ part1 / ๋ธ”๋กœ๊ทธ์— ์ •๋ฆฌ

2018.02.22

์˜ค๋žœ๋งŒ์— ์นด์ฝ”!

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ํ—ฌ๋กœ์ฝ”๋”ฉ ํ•ด์‹œํ…Œ์ด๋ธ” chapter5 ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„ ์ฝ๊ณ  ๊ณต๋ถ€
      • ํ‚ค์›Œ๋“œ: O(n)ํ•ด์‹œํ…Œ์ด๋ธ”์—์„œ์˜ ์ถฉ๋Œ, ์‚ฌ์šฉ๋ฅ (์‚ฌ์šฉ๋ฅ  < 1 == ์ถฉ๋Œ์ด ์ ๋‹ค. ์„ฑ๋Šฅ ์ƒ์Šน. vs ์‚ฌ์šฉ๋ฅ  > 1 == ์ถฉ๋Œ์ด ์žฆ๋‹ค. ์„ฑ๋Šฅ ์ €ํ•˜.)
    • ํ•ด์ปค๋žญํฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’ˆ - Birthday Chocolate
  • ์Šค์œ„ํ”„ํŠธ ์ œ๋„ˆ๋ฆญ ๋ฆฌ๋ทฐ part2
  • JSON ๋งˆ์ง€๋ง‰ step ๋ฆฌ๋ทฐ wiki ์—…๋Žƒ(๋“œ๋””์–ด JSON๋ฆฌ๋ทฐ ์™„๋ฃŒ! ๋ฆฌ๋ทฐํ•  ๊ฑฐ๋ฆฌ๊ฐ€ ์ •๋ง ๋งŽ์€ ๋ฏธ์…˜์ด์—ˆ์–ด์„œ ๋ฆฌ๋ทฐ๋งŒ ํ•ด๋„ ์˜ค๋ž˜๊ฑธ๋ฆฌ๊ณ  ๋„ˆ๋ฌด ํž˜๋“ค์—ˆ๋‹คใ… ใ…  ํ•˜์ง€๋งŒ ๋ฟŒ๋“ฏ)

2018.02.23

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ํ•ด์ปค๋žญํฌ ์บฅ์ปค๋ฃจ ํ’€๋‹ค๊ฐ€โ€ฆ.ํ™”๊ฐ€๋‚œ๋“œ์•„์•„์•„ ์‰ฌ์šด๊ฑฐ๊ฐ™์€๋ฐ ์™œ ํ’€์ง€๋ฅผ๋ชปํ•˜๋‹ˆ
    • ํ—ฌ๋กœ์ฝ”๋”ฉ chapter6 ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰ ๋ณด๊ธฐ
  • ์Šค์œ„ํ”„ํŠธ ์ œ๋„ˆ๋ฆญ ํฌ์ŠคํŒ… ์—…๋ฐ์ดํŠธ
  • ์ดˆ๊ธฐํ™” - ๋น…๋„ˆ๋“œ๋žœ์น˜

2018.02.25

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ํ•ด์ปค๋žญํฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - Divisible Sum Pairs
    • ์ธํ”„๋Ÿฐ - ๊ทธ๋ž˜ํ”„์˜ ๊ฐœ๋…๊ณผ ํ‘œํ˜„๊ฐ•์˜ ๋“ค์Œ
      • keyword: ๋…ธ๋“œ(์ •์ ), ์—ฃ์ง€, ์›จ์ดํŠธ(๊ฐ€์ค‘์น˜), ์ธ์ ‘, ์—ฐ๊ฒฐ,์—ฐ๊ฒฐ์š”์†Œ, ์ธ์ ‘ํ–‰๋ ฌ(๋Œ€์นญ), ์ธ์ ‘๋ฆฌ์ŠคํŠธ(๋…ธ๋“œ ์ˆ˜๋Š” 2*์—ฃ์ง€ ์ˆ˜), ๊ฐ€์ค‘์น˜๊ทธ๋ž˜ํ”„
  • ์ง€ํ‚ฌ๋ธ”๋กœ๊ทธ ๊ฐ€๋…์„ฑ ๋†’์€ ํฌ์ŠคํŠธ์Šคํƒ€์ผ, ํฐํŠธ๋กœ ๋ฐ”๊พธ๊ธฐ : cssโ€ฆ์žฌ๋ฐŒ๋Š”๋ฐ?
  • ์ฝ”๋“œ๋ธ”๋Ÿญ์ด ์ž๊พธ swift๋กœ ์ ์šฉ์ด ์•ˆ๋๋˜ ์ด์œ  : swift ๋กœ ์ฝ”๋“œ๋ธ”๋Ÿญ์„๋งŒ๋“ค๋•Œ Swift์ฒ˜๋Ÿผ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋ฉด ์ฝ”๋“œ๋ธ”๋Ÿญ์ด ์–ด๋–ค ์Šคํƒ€์ผ์„ ํƒํ• ์ง€ ์ฐพ์ง€ ๋ชปํ•˜๋Š”๋“ฏ! ๊ผญ ์†Œ๋ฌธ์ž๋กœ ์จ์ฃผ๊ธฐ

TIL_20180212 ~ 20180218

|

2018.02.12

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ์ดˆ
    • ํ—ฌ๋กœ์ฝ”๋”ฉ chapter2 ์„ ํƒ์ •๋ ฌ
    • ์„ ํƒ์ •๋ ฌ์ฝ”๋“œ ์Šค์œ„ํ”„ํŠธ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค
  • ์žํŒ๊ธฐ ๋ฏธ์…˜ ์ง„ํ–‰
    • ์Œ๋ฃŒ์ˆ˜์— itemCode์†์„ฑ ์ถ”๊ฐ€ํ•˜๋Š”๊ฑธ๋กœ ์ผ๋‹จ ํ•ด๊ฒฐ.
    • ๊ฐ์ฒด ์†์„ฑ์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  enum์„ ์ด์šฉํ•ด์„œ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ, enum ์œผ๋กœ ๋งŒ๋“ค๋ฉด ๋” ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ  ๊ฒ€์‚ฌํ•ด์•ผ ํ•  ๋‹จ๊ณ„๊ฐ€ ๊ธธ์–ด์ง€๋Š”๋ฐ ์–ด๋–ค ๊ฒŒ ๋” ํšจ์œจ์ ์ธ๊ฑด์ง€ ํ™•์‹ ์ด ๋“ค์ง€ ์•Š์•„์„œ ์ผ๋‹จ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ง„๋„๋ฅผ ๋‚˜๊ฐ€๋Š” ๊ฑธ๋กœ ๋งˆ์Œ์„ ๊ณ  enum์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋กœํ–ˆ๋‹ค. ์ด๊ฑด ํ”ผ๋“œ๋ฐฑ๊ณผ ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›๊ณ  ๊ณ ์ณ๋‚˜๊ฐ€๋Š” ๋ถ€๋ถ„์ด ์ข€ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

2018.02.13

TIL

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ์ดˆ
    • ํ—ฌ๋กœ์ฝ”๋”ฉ chapter3 ์žฌ๊ท€ ๊ณต๋ถ€!
      • keyword: ์Šคํƒ, ํ˜ธ์ถœ์Šคํƒ, ์žฌ๊ท€๋‹จ๊ณ„, ๊ธฐ๋ณธ๋‹จ๊ณ„
  • ์žํŒ๊ธฐ
    • ์Šคํ…3 ์š”๊ตฌ์‚ฌํ•ญ ์™„๋ฃŒ!
      • ์•ˆ๋˜์„œ ๋ช‡์ผ๋™์•ˆ ์ •์ฒด์ƒํƒœ์˜€๋Š”๋ฐ, ํ•„์š”์—†๋Š”๊ฑธ ์ฐจ๊ทผ์ฐจ๊ทผ ์ง€์šฐ๊ณ  ์ƒ๊ฐํ•˜๋‹ˆ ์ผ๋‹จ ์š”๊ตฌ์‚ฌํ•ญ๋Œ€๋กœ ๋Œ์•„๊ฐ€๊ฒŒ๋Š” ๋งŒ๋“  ๊ฒƒ ๊ฐ™๋‹ค.
      • ๋ณต์žกํ•ด์ง„ ๋กœ์ง๊ณผ ๋„ˆ๋ฌด ๊ฐ€์ง“์ˆ˜๊ฐ€ ๋งŽ์•„์ง„ ๊ตฌ์กฐ์ฒด๋ฅผ ์ค„์˜€๋”๋‹ˆ ํ•ด๊ฒฐ์ฑ…์ด ๋ณด์˜€๋‹ค.
      • JSON 2๋‹จ๊ณˆ๊ฐ€? ํ• ๋•Œ๋„ ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฒŒ ์งœ์„œ ํ•œ๋ฒˆ ๊ธด ์ •์ฒด๊ธฐ๊ฐ€ ์™”์—ˆ๋Š”๋ฐ, ์—ญ์‹œ ์ด๋ฒˆ์—๋„ ํ•„์š”์—†๋Š” ๋™์ž‘๊ณผ ํ•„์š”์—†๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ๋„ˆ๋ฌด๋งŽ์ด ๋งŒ๋“ค์–ด๋†จ๋‹คโ€ฆ ์ข€ ๋” ๋””ํ…Œ์ผํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ ์‹ถ์€ ์š•์‹ฌ๋•Œ๋ฌธ์— ์ถ”๊ฐ€ํ•˜๊ฒŒ๋˜์—ˆ๋Š”๋ฐ, ์ผ๋‹จ ๊ณต๋ถ€ํ•˜๋Š”(๋ฏธ์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š”)์ž…์žฅ์—์„œ๋Š” ์ผ๋‹จ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋จผ์ € ํ‘ธ๋Š”๊ฒŒ ๋จผ์ €๋‹ˆ๊นŒ ์š”๊ตฌ์‚ฌํ•ญ์—๋งŒ ์ง‘์ค‘ํ•˜๊ธฐ๋กœํ•˜๊ณ  ๋””ํ…Œ์ผํ•œ ๋ถ€๋ถ„์„ ๋‹ค ์ œ๊ฑฐํ–ˆ๋‹ค.
      • ์ผ๋‹จ ๋Œ์•„๊ฐ€๋‹ˆ ๋‹ค์‹œ ๊ณ ์ณ๋ณด๊ณ ์‹ถ์€ ๋งˆ์Œ๋„ ์ƒ๊ธฐ๊ณ , ๊ฐ„๋‹จํ•˜๋‹ˆ๊นŒ ์–ด๋””๊ฐ€ ๋ฌธ์ œ์ธ์ง€ ๋” ๋ฌธ์ œ์ ์ด ์ž˜ ๋ณด์˜€๋‹ค. ๋ณต์žกํ•˜๊ณ  ๋„ˆ๋ฌด ์˜ค๋žซ๋™์•ˆ ์ •์ฒด๋˜์–ด์žˆ์„๋•Œ๋Š” ์—†์•จ๊ฑด ์—†์• ๊ณ  ๊ณผ๊ฐํ•˜๊ฒŒ ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด๋Š”๊ฒŒ ๋” ๋‚˜์€ ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค!

2018.02.14

TIL

  • ์นด๋“œ๊ฒŒ์ž„step5 ํšŒ๊ณ , ์•„๋ž˜ ๋‚ด์šฉ ์œ„์ฃผ๋กœ ํšŒ๊ณ ํ•™๊ธฐ!
    • ์นด๋“œ comparable ๊ตฌํ˜„
    • ๊ฐ์ฒด์—ญํ•  ์žฌ๋ถ„๋‹ด : winning ์นด๋“œ ๋ฝ‘๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ์™ธ๋ถ€์—์„œ ์นด๋“œ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ ๋น„๊ตํ•˜๋ ค๊ณ  ํ–ˆ๋˜ ๊ฒƒ์„ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์€ ํ›„์—๋Š” ์นด๋“œ ๋‚ด์—์„œ ๋น„๊ตํ•ด์„œ ๊ฒฐ๊ณผ๊ฐ’์„ ์•Œ๋ ค์ฃผ๋Š” ๊ตฌ์กฐ๋ฅผ ์•Œ๊ฒŒ๋๋‹ค๋Š” ์ .
    • Hands๊ตฌ์กฐ์ฒด ๋ถ„๋ฆฌ : ๊ตฌํ˜„ํ–ˆ์„๋•Œ ๊ตฌ์กฐ์ ์œผ๋กœ ์นด๋“œ pair๋งŒ ๋น„๊ตํ•ด์„œ ์ •๊ตํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๊ธฐ๊ฐ€ ์–ด๋ ค์› ๊ณ  ํƒ‘์นด๋“œ๋ฅผ ์•Œ์•„์•ผ ๋˜๋Š” ๋ฌธ์ œ์ ์ด ์žˆ์—ˆ๋Š”๋ฐ ๊ทธ๋ ‡๊ฒŒ hands๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ์œ„ํ•ด์„œ ์•„์˜ˆ ๊ตฌ์กฐ์ฒด๋ฅผ ๋งŒ๋“ค์—ˆ๋˜ ์ 

2018.02.15 - 17

TODO

  • ์„ค๋‚ ์ด๋ผ ์นœ์ฒ™ ์ง‘์—๊ฐ€์•ผํ•ด์„œ ๊ณต๋ถ€๋Š” ๊ทธ๋ฆฌ ๋งŽ์ด ๋ชปํ•  ๊ฒƒ ๊ฐ™๊ณ , ์‹œ๊ฐ„์ด ๋งŽ์ด๋“ค์ง€๋งŒ ์™• ์ง‘์ค‘์ด ๊ทธ๋ฆฌ ํ•„์š”์น˜์•Š์€? ์ผ๋“ค์„ ํ•˜๊ธฐ๋กœํ–ˆ๋‹ค.
  • ๋ธ”๋กœ๊ทธ ์ •๋ฆฌ : swift๋‚ด์šฉ์„ ์ •๋ฆฌ๋ฅผ ๋งŽ์ด ๋ชปํ–ˆ๋Š”๋ฐ, swift in Date ์ฃผ์ œ๋กœ ์˜ค๋žœ๋งŒ์— ํ•˜๋‚˜ ์˜ฌ๋ฆฌ๊ธฐ
  • JSON parser ํ”ผ๋“œ๋ฐฑํ•˜๊ธฐ, ์˜ˆ์ „ ํ”ผ๋“œ๋ฐฑ๊ณผ PR ๋ฆฌ๋ทฐ ์ฝ”๋ฉ˜ํŠธ ์ฝ์–ด๋ณด๊ธฐ - 2์›” ๊ณ„ํš์ค‘ ํ•˜๋‚˜์˜€์Œ
  • ํ•ด์ปค๋žญํฌ ๋ฌธ์ œํ’€๊ธฐ ๊ผญ ๋งค์ผ 3๋ฌธ์ œ!
  • ์žํŒ๊ธฐ ๋ฆฌํŒฉํ† ๋ง
    • ์Œ๋ฃŒ๊ฐ€ ํ•œ๊ฐœ๋‚จ์•˜์„๋•Œ ๋‚˜๋จธ์ง€ ํ•œ๊ฐœ๋ฅผ ์‚ฌ๋ฉด removeํ•ด๋ฒ„๋ฆฌ๊ณ  ๋ฆฌํ„ดํ•ด์„œ ์•ˆ๋จ!!(๋ฆฌ๋ฌด๋ธŒ ํ•œ ๋’ค์— ๋ฆฌํ„ดํ•˜๋‹ˆ๊นŒ)
  • ํ•ด์ปค๋žญํฌ ํ‘ผ ๋ฌธ์ œ์ค‘์— ๋ฌธ์ž์—ด ์ž๋ฅด๋Š” ์ž‘์—…์„ ๋งŽ์ด ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”๋ฐ (Time Conversion)์Šค์œ„ํ”„ํŠธ์—์„œ ๋ฌธ์ž์—ด ์ž๋ฅด๋Š”๊ฒŒ ์ข€ ๊นŒ๋‹ค๋กญ๊ณ  ๋‹จ์œ„๋ณ€ํ™˜๊ธฐ๋•Œ๊ฐ€ ์ƒ๊ฐ๋‚˜์„œ ์ฝ”๋“œ์ข€ ์ •๋ฆฌํ•˜๋ ค๊ณ  ๋ณต๋ถ™! ```Swift import Foundation

let time = readLine()!

func timeConversion(_ time: String) -> String { var range = time.index(time.startIndex, offsetBy: 8)..<time.endIndex let unit = String(time[range]) let hourRange = time.startIndex..<time.index(time.startIndex, offsetBy: 2)

switch unit {
case "AM":
    let hour = String(time[hourRange])
    range = time.startIndex..<time.index(time.endIndex, offsetBy: -2)
    if hour == "12" {
        return String(time.replacingOccurrences(of: hour, with: "00")[range])
    }
    return String(time[range])
case "PM":
    let hour = String(time[hourRange])
    if hour == "12" {
        range = time.startIndex..<time.index(time.endIndex, offsetBy: -2)
        return String(time[range])
    }
    let convertedHour = convert(hour)
    range = time.startIndex..<time.index(time.endIndex, offsetBy: -2)
    return String(time.replacingOccurrences(of: hour, with: convertedHour)[range])
default:
    return time
}
return time }

func convert(_ hour: String) -> String { return String(24-(12 - (Int(hour)!))) }

print(timeConversion(time))

```

2018.02.15 - 17

TIL

  • ํ•ด์ปค๋žญํฌ ๋ฌธ์ œ 2๊ฐœ ํ’ˆ
  • JSON feedback ์ •๋ฆฌํ•จ - step4
  • VendingMachine์—์„œ buy / remove๋ฒ„๊ทธ ํ•ด๊ฒฐ
  • ํ—ฌ๋กœ์ฝ”๋”ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ€ต์ •๋ ฌ ์ฝ์Œ

2018.02.18

TIL

  • github ๋ธ”๋กœ๊ทธ ๊ตฌ๊ธ€ ๊ฒ€์ƒ‰์—”์ง„์— ๋“ฑ๋ก! ์ด์ œ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๊ตฌ๊ธ€์— ๋‚˜์˜จ๋‹ค.
  • github ๋ธ”๋กœ๊ทธ ๋„ค๋น„๊ฒŒ์ด์…˜, ํ™ˆํ™”๋ฉด, ์นดํ…Œ๊ณ ๋ฆฌ ํŽ˜์ด์ง€ ์ปค์Šคํ…€!

TIL_20180205 ~ 20180209

|

2018.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

๋ฐฉํ•™๊ฒธ ๊ธฐ๋ถ„์ „ํ™˜ ๊ฒธ ์ž ์‹œ ์‰ฌ๋Ÿฌ ๋™ํ•ด๋กœใ… ใ… ..!