오늘 한 일

  1. Whale 브라우저를 다운받고 쓰기 시작했다. 공식문서를 읽을 때 텍스트를 드래그하면 파파고 번역 기능과 영어사전을 사용할 수 있어 용이하다. 하지만 번역이 파파고 앱(?) 만큼 퀄리티가 좋지는 않다. 그리고 다른 브라우저의 북마크나 자동 로그인 정보를 가지고 올 수 있어서 편리하다. 브라우저 홈에 간단한 형태지만 to do list가 있어서 좋다.
  2. Sturcture 구조체의 immutable, mutating에 대한 공식 문서를 봤다.
    https://docs.swift.org/swift-book/LanguageGuide/Methods.html#//apple_ref/doc/uid/TP40014097-CH15-ID239
  3. safari 브라우저의 reading List 기능을 활용하기 시작했다.
  4. 객체지향에 맞지 않는 코드를 객체 지향에 맞게 리팩토링하는 방법에 대한 1시간 정도의 강의를 들었다.
  5. 셔플 알고리즘에 대해서 공부했다.

새롭게 알게 된 것

1.Fisher–Yates shuffle algorithm (original)

var items = ["A", "B", "C", "D", "E", "F", "G", "H"]
var shuffled = [String]();

for i in 0..<items.count
{
    let rand = Int(arc4random_uniform(UInt32(items.count)))

    shuffled.append(items[rand])

    items.remove(at: rand)
}

print(shuffled)

2.Knuth Shuffle: Fisher–Yates shuffle algorithm (modern)
https://developer.apple.com/videos/play/wwdc2018/406/?time=1289
(동영상 "Fisher–Yates shuffle" 부분은 23:05 ~ )

애플의 shuffle 메소드는 이 방식으로 구현됐다.

var items = ["A", "B", "C", "D", "E", "F", "G", "H"]
var last = items.count - 1

while(last > 0)
{
    let rand = Int(arc4random_uniform(UInt32(last)))

    print("swap items[\(last)] = \(items[last]) with items[\(rand)] = \(items[rand])")

    items.swapAt(last, rand)

    print(items)

    last -= 1
}

original과 달리 두 개의 Collection이 필요없다.
https://daheenallwhite.github.io/programming/algorithm/2019/06/27/Shuffle-Algorithm-Fisher-Yates/
3. navie shuffle algorithm vs Fisher–Yates shuffle
https://dyladan.me/abc/2016/01/20/shuffle/
https://gist.github.com/robertmryan/b002b7d524646fd677bb3979c89ec331

extension Array {
    
    /// Simple implementation of Fisher-Yates
    
    mutating func shuffle() {
        for i in 0 ..< count - 1 {
            let j = i + Int(arc4random_uniform(UInt32(count - i)))
            swapAt(i, j)
        }
    }
    
    /// Naive implementation that introduces biases
    
    mutating func shuffleBiased() {
        for i in 0 ..< count {
            let j = Int(arc4random_uniform(UInt32(count)))
            swapAt(i, j)
        }
    }
}

navie shuffle은 편향된 셔플 결과를 보이는 반면 Fisher-Yates shuffle은 항상 비슷한 셔플 결과를 보인다.

  1. shuffle(), shuffled()
    shuffle(): https://developer.apple.com/documentation/swift/emptycollection/2995458-shuffle
    shuffled():
    https://developer.apple.com/documentation/swift/array/2994757-shuffled
    공통점 : Collection의 value들을 섞는다, 복잡도가 O(n)이다
    차이점: shuffled 메소드는 셔플한 Collection을 반환한다.

  2. recursive

    lhs와 rhs를 비교하는 메소드에 lhs == rhs 를 리턴하는 코드를 구현해서 다시 lhs와 rhs를 비교하는 메소드를 호출한다 -> recursive.
    따라서 lhs 와 rhs 의 어떤 속성을 비교했을 때 같다고 판단하는지를 메소드에 명시해줘야 한다.

  3. xcode playgournd code folding ribbon -> depth를 볼 수 있다.

적용해 본 것

  1. TDD를 시도해봤다. 테스트 코드를 먼저 짜고 Red를 Green으로 바꾸고 Refector 해봤다. 테스트 코드를 짤 때 Given, When, Then으로 나눠서 짜봤다.

오늘의 시도와 결론

[ 실패 하나 😊 ]
테스트 코드를 먼저 작성해놔도 Equatable을 제대로 작성하지 않아서 시간을 많이 빼겼다. 오늘 새로 알게된 점 5번과 관련된 내용이다.

[ 결론 👩‍💻 ]
일단 만들어놓고 print 찍어봐야지 하는 생각보다는 이 테스트가 동작이 되게 해야겠다는 식의 목표가 있는 접근이 좋았다. 다만 고민거리는 있었다. 테스트 함수는 여러 값 중에서 어떤 값을 테스트 하는 게 좋을지, 어디부터 어디까지 테스트해야 하는지. 앞으로 테스트 함수를 많이 짜봐야겠다.

[ 성공 둘 😊 ]
크로스핏을 시작했다.

[ 결론 👩‍💻 ]
각자 자기 페이스에 맞춰서 다같이 하는 운동이다. 그럼면에서 프로그래밍과 같은 것 같다. 2-3월은 그래서 운동을 하면서 마음을 계속 다잡아야겠다.

궁금한 점

🧐❓: 테스트 함수를 통과한 코드가 신뢰가 있으려면 테스트 코드로 어떤 걸 테스트 해야할까?

😁 ❗️
... 찾아서 업데이트 할 예정.

내일 할 일

내일 아침에 정리하겠습니다....ㅠ
일단 enum이나 테스트 코드, 랜덤이 진짜 랜덤인지 테스트하는 방법, set함수 등
객체 지향적으로 iOS 코드를 짠다는게 어떤건지 알아보기
View LifeCycle 알아보기
https://velog.io/@delmasong/Understand-the-View-Controller-LifeCycle
View와 Window, view와 ViewController의 관계 알아보기 (공식문서 읽기)

느낀점

시도해보고 실패한걸 시간 날렸다고 생각하지 말자.
어차피 다 필요한 과정이고 삽질 하면서 배운다.

profile
Swift, iOS 앱 개발 공부하고 있어요!

0개의 댓글