Good
- 프로젝트 파일 구조 변경
- 문서 백업 스크립트 만듬!! 후후 이제 언제든 다른 플랫폼으로 이동할 수 있음.
- 집중해서 핫픽스 문제 해결
- 디버그 메뉴 골격 및 화면 구성.
- 꾸준한 운동 3달째 달성중.
Bad
- 마음에 화가 많아졌다.
- 개발 서적 공부 및 비트코인 공부를 할 수가 없었다.
- 블로그 글을 쓰지 못했다.
Learns
// AS-IS
if let crossoverData = data.crossover,
let id = crossoverData.id,
let name = crossoverData.name {
self.crossover = AuxTypeData(id: id, name: name)
} else {
self.crossover = nil
}
// TO-BE
let crossover = aux.crossover.flatMap {
curry(AuxTypeData.init(id:name:)) <*> $0.id <*> $0.name
}
public func curry<A, B, C>(_ f: @escaping (A, B) -> C) -> (A) -> (B) -> C {
{ a in { b in f(a, b) } }
}
public func <*><A, B>(lhs: ((A) -> B)?, rhs: A?) -> B? {
guard let lhs = lhs,
let rhs = rhs else {
return nil
}
return lhs(rhs)
}- 연속적으로 nil이 뜨는 구조의 경우에는 flatMap을 사용하자.
- 내부 변수가 nil인 경우 instance가 생성될 수 없는 경우다.
- 원래 같으면, nil 체크를 한다음에 없으면 nil로 세팅해줬는데,
- 생성자가 함수인점을 이용해서 currying을 사용하여 일단 인자와 함수와의 커플링을 없앤다.
- 그 다음, 함수와 인자가 nil인 경우에 대한 연산자(
<*>)를 정의하고, 그럴 경우 nil을 던지는 것으로 처리한다.
Commitment
- C언어 강의
- SwiftUI 강의
- 구현패턴
이거 언제함?
- 비트코인에 관련되어서 내가 아는 내용을 바탕으로 모식도를 그려봐야 할듯.
- 지갑앱을 만들어보는 것도 좋음
- 이 과정에서 Swift UI 사용
- 시중에 나와 있는 지갑앱이 약간 별로임.
- 아침에 좀더 일찍 일어나야 할듯 ㅠ
- 체지방 22%를 위해 달려보자.