사용자가 버튼을 통해 쥬스를 주문하면 쥬스를 만들어주고 재료를 소모합니다. 재료 수정 페이지를 통해 부족한 재료를 추가할 수 있습니다.
stone | 제이푸시 |
---|---|
- 쥬스 제조 버튼 클릭 시 재고가 충분할 경우 쥬스를 제조하고, 재고가 부족할 경우 재고 부족 알림 (실패)를 띄웁니다.
- 과일의 재고를 수정하는 부분입니다.
- 레시피를 만들 때 둘 중 어떤 방식을 채택할지 고민했습니다.
- [.strawberry : 10, .banana : 1]
- [(.strawberry, 10), (.banana, 1)]
- 가독성이 조금 더 좋다고 생각한 딕셔너리를 사용했습니다.
- 예상외의 에러를 체크해주는 부분을 한번에 묶어주기 위해서
LocalizedError
를 사용했습니다.
- 딕셔너리를 가지는
Struct
로 구현했으나 enum의 값들과 중복되는 부분이 많아, enum내에 enum value를 이용해 레시피를 구현하는 방법을 채택했습니다.
이미 유효성을 확인 한 후에 Dictionary
의 값을 사용할 때
fetchFruitAmount
함수를 사용하여, 과일의 유효성 체크를 하는데, 유효성 체크 후useFruits
함수를 사용하여 과일의 갯수를 감소시킵니다.useFruits
함수 내부에서Dictionary
값인fruits
를 사용하는데,이미 유효성 검사가 끝난 값이라 굳이throw
로 에러를 던지지 않고return
으로 처리해도 되지 않을까 고민했습니다.
딕셔너리 [Fruit : Int]를 사용해서 과일 저장소를 구현할 때 Int의 모호함을 해결하기 위한 고민
딕셔너리로 표현시 처음 보는 사람이 의미를 잘 파악하지 못할 수 있으므로 과일명과 재고를 가지고 Struct
를 정의해서 구현을 고민했습니다.
-
Typealias 파일을 만들어서
typealias
들을 명시합니다.- 단점: 사용하는 파일에
typealias
가 무슨 타입인지 구현을 확인해야 합니다.
- 단점: 사용하는 파일에
-
사용하는 파일에 각각
typealias
를 명시해줍니다.- 단점: 다른 파일의 코드를 가져다 쓴다면 매개변수에 쓰이는 부분때문에 중복 명시가 있습니다.
두가지 방법중 1번의 단점을 좀 더 크게 보고 2번의 방법을 채택하고 싶었으나 파일의 길이가 길어지면 1의 단점이 똑같이 드러나게 된다고 생각했습니다. 2가지 방법으로도 해결을 하지 못한다 생각해서 Struct
로 딕셔너리를 구현할 생각을 했습니다.
Sturct
로 구현하는 방법을 채택하여 진행하려 했지만, Dictionary
를 사용했을 때의 로직들을 전부 리팩토링이 이루어져야해, 비효율적으로 느껴졌습니다. 그래서 Dictionary
값을 할당하고 있는 fruits
변수의 네이밍 수정을 통하여 Dictionary
타입의 방식을 채택하기로 결정했습니다.
ViewController
->EditStockViewController
전달하는 부분에서 싱글톤 이외에Key-Value Observing(KVO)
,delegate
패턴을 사용하여 구현해보았습니다.- Key-Value Observing(KVO) -
kvoTest
브랜치에 구현하였습니다. ⭐️KVO 패턴 사용 브랜치 delegate
패턴 -delegateTest
브랜치에 구현하였습니다. ⭐️delegate 패턴 사용 브랜치
- Key-Value Observing(KVO) -
Swift Language Guide - Initialization
Swift Language Guide - Error Handling