아삭아삭 iOS 개발

[TIL] 2022.07.15 (SeSAC iOS) 본문

TIL(Today I Learned)

[TIL] 2022.07.15 (SeSAC iOS)

바닐라머스크 2022. 7. 15. 23:57

 

 

오늘 공부한 내용들을 내가 잊지 않기 위해 기록합니다.

틀린 내용이 있을 수 있는 점 참고 부탁드립니다 :)

 

■ 오늘 & 주말 과제

지난 2주간 수업내용 복습 철저히 해보기!!

원래 오늘 평가과제가 나갈 예정이었는데, 아쉽게도 다음주로 미뤄지고

이번 주말은 이제까지 배운 내용을 잘 소화해보는 시간이 되었다.

진짜 다행이다..흡

 

이번주 주말동안 (최소한) 아래 4개 기능들 추가구현 해 볼 예정이고,

정리못한 문법들이나 Mission과제들도 보충해야겠다.

 

  • 넷플릭스 로그인 화면에서 화면 전환 구현해보기
  • 넷플릭스 로그인 화면에서 조건에 따라 얼럿을 띄워보는 것
  • 기념일 계산기 앱에서 설정한 Date를 저장해보는 것
  • 감정일기 카운트를 리셋해보는 것 (userDefault)

 

오늘은 자기전에 감정일기 카운트를 리셋만큼은 구현해보고 자야겠다!

userDefault에 대해서 오늘 처음 알게 되어서 꼭 적용해보고 싶다.


감정 다이어리 App

감정 데이터의 저장 및 삭제

 

  • 감정버튼 클릭시 숫자 증가하기 & 저장하기
    - 기존에 if 문과 [sender.tag]으로 구현했던 코드에 userDefaults 를 적용하기가 쉽지 않았다
    - 가장 삽질을 오래했던 포인트 2개는 아래와 같았다.

    ① '기존 감정숫자 가져오기(userDefaults.standard.데이터타입)~새로운 데이터 저장하기(userDefaults.standard.set)' 사이의 연결을 어떻게 할까?
    → 데이터 저장소에서 받아온 기존 데이터에 Int값 1을 더해주고, emotionArray[sender.tag] 에 담아서 스무스하게 저장단계로 넘어가고 싶었으나 index 오류가 났다.
    데이터 타입을 맞춰줘야 할 것 같아서 데이터 가져오기&저장하기 단계와 데이터 타입을 통일하기로 했다.

     ② 감정버튼 클릭시 데이터 가져오고/증가시키고/저장해서/출력하는 cycle을 기존처럼 [sender.tag]을 사용해서 한번에 끝내고 싶은데 어떻게 적용해볼까?
    → (1차시도) 초반에 userDefaults 사용시, 데이터 형식을 object로 주고 코드 끝에 'as? [Int] ?? [Int]()' 혹은 '?? [0, 0, 0, 0, 0, 0, 0, 0, 0]' 이렇게 직접 타입을 정해주려고 했다.
    (말이 되는지는 모르겠지만) 역시나 뒤에가니 데이터 타입 Any 때문에 골치가 아파졌다.
    → (2차시도) 데이터 타입을 array로 해보자! 했지만 위에 부분이랑 함께 고민하다가
    굳이 array로 해야하나? 어차피 key를 기준으로 데이터를 관리하는거니까 굳이 array에 집착할 필요가 없음을 깨닫고 깔끔하게 Int로 가기로 했다.

진행시켜!!!

        → (3차시도) 데이터를 가져올때 userDefaults.standard.integer로 가져오고, 키값에 "emotion\([sender.tag])"를 넣어서 돌렸다! 성공!

   // MARK: - 감정버튼 클릭시 로직
    @IBAction func buttonTapped(_ sender: UIButton) {
        
        // 기존 감정 데이터 가져오기
        let currentValue = defaults.integer(forKey: "emotion\([sender.tag])") // 고민포인트(2)
        
        // 감정별 클릭수 증가
        let updateValue = currentValue + 1   // 고민포인트(1)
        
        // 새로운 감정수 배열값 저장
        defaults.set(updateValue, forKey: "emotion\([sender.tag])")
        
        // 전체 감정숫자 출력
        emotionLabels[sender.tag].text = #"\#(emotionDataArray[sender.tag]) \#(defaults.integer(forKey: "emotion\([sender.tag])"))"#
    }

 

  • 감정일기 카운트를 리셋해보기
    → 감정일기 카운트를 removeObject로 전체삭제 해준 후, 초기화된 상태를 또다시 가져와서 저장해준다음 출력해야 하나 싶었다.
    그래서 '전체삭제~초기화 상태 출력' 사이에 데이터 가져오고&저장해주는 단계를 넣어서도 돌려보고, 빼고도 돌렸는데 화면상 기능은 동일했다.
    다시 생각해보니 리셋상태를 저장해야 다음실행 때 깔끔한 상태가 나올 수 있는거니까 아래처럼 마무리했다.

    // MARK: - 감정 수 저장기록 초기화하기
    @IBAction func removeAllButtonTapped(_ sender: UIButton) {
        for i in 0...(emotionArray.count - 1) {
            // 삭제하고
            defaults.removeObject(forKey: "emotion\([i])")
            
            // 삭제한 상태를 가져와서 저장하고
            let currentValue = defaults.integer(forKey: "emotion\([i])")
            defaults.set(currentValue, forKey: "emotion\([i])")
            
            // 전체 감정숫자 출력
            emotionLabels[i].text = #"\#(emotionDataArray[i]) \#(defaults.integer(forKey: "emotion\([i])"))"#
        }
    }

마무리

코드짤때는 어떻게 구성해서 엮어야 하나 엄청 고민하고, 개념 찾아보면서 온갖 방법으로 다해보는데

막상 성공하고나서 완성된 코드는 심플해서 약간 허무하다

 

다른 사람들한테는 간단한 로직인데 나만 혼자 낑낑대면서 하는 것 같아 걱정도 되지만

꾸준히 하다보면 잘하게 되겠지~

 

고민하다가 문제가 풀리는 순간이 재밌기도 하다.

다음에 userDefaults 쓸일 있으면 오늘보다는 잘할 것 같다!

'TIL(Today I Learned)' 카테고리의 다른 글

[TIL] 2022.07.18 (SeSAC iOS)  (0) 2022.07.18
[TIL] 2022.07.16~17 (SeSAC iOS)  (0) 2022.07.17
[TIL] 2022.07.14 (SeSAC iOS)  (0) 2022.07.14
[TIL] 2022.07.13 (SeSAC iOS)  (0) 2022.07.13
[TIL] 2022.07.12 (SeSAC iOS)  (0) 2022.07.12