전체 글 24

식권계산기 - 제 4 화: 식권이 부족할 때

꼭 한두장씩 부족하더라 식권 계산 시 항상 식권이 충분하던가요? 제가 재직한 회사에서 식권을 지급하는 원칙은 근무 일수당 한 장, 야근한 일 수만큼 추가 지급이 원칙이었습니다. 회사가 입주한 건물 지하 식당에서는 한 장만으로 한끼를 먹을 수 있었기 때문에 매일 지하 식당만 간다면 지급받는 식권만으로 충분했겠죠. 그러나 매번 식판에 밥을 먹는 것이 때론 지겹기도했고 회사 업무의 고단함을 조금이라도 더 달래고자 근처의 외부 식당에서 식사를 즐기기도했습니다. 그렇게 자주 외부 식당을 이용하다보면 남은 식권만으로는 음식값을 계산할 수가 없었습니다. 꼭 한두장씩 부족한 상황을 마주하곤 했는데, 바로 이 부분에 도움이 될 기능을 이번 업데이트에 반영하였습니다. 이번 업데이트 식권이 부족한 상황에서 "식권이 부족해요..

식권계산기 - 제 3 화: 설정가격표시

프롤로그 사용자가 식권의 가격을 설정한 이후에 제대로 설정이 돼있는지 확인하려면, 기존에는 다시 설정 화면으로 들어가봐야했다. 설정된 식권 가격을 메인화면에서 확인할 수 있다면 계산결과를 신뢰하는데 도움이 될 것이다. 이번 업데이트 설정된 가격을 화면에 표시한다. 다크모드로 보이지 않던 것을 다크모드 지원 안함으로 해결 이번 공부한 내용 버튼 레이블 업데이트 setTitle 메소드 [공식문서] userDefaults 굴러가는 방식 [공식문서] 다크모드 지원안하는 방법 [이웃블로그] 다음 업데이트 식권이 부족한 상황에서 사용할 수 있는 기능. 식권으로 계산하더라도 내가 가진 식권이 부족한 경우가 있다. 보통 한두장이 모자르고 가지고 있는 식권을 모두 소진하면서 잔액을 추가결제하는 경우가 있다. 다음 공부할..

alert 팝업 만들기

alert 만들기 //얼럿 오브젝트 생성 let alert = UIAlertController(title: "타이틀", message: "얼럿 메세지", preferredStyle: .alert) //얼럿에 붙을 확인/취소 버튼 오브젝트 생성 let defaultAction = UIAlertAction(title: "확인버튼이름", style: .default) { action in /* 버튼을 눌렀을 때 수행할 코드 */ } } let cancelAction = UIAlertAction(title: "취소버튼이름", style: .cancel, handler: nil) //버튼 오브젝트를 얼럿 오브젝트에 "순서대로" 붙이기 alert.addAction(cancelAction) alert.addActio..

Best Practices 2021.11.13

Unit 4 - Lesson 8: System View Controllers

목표 alert contoller를 표시하고 사용자 선택에 반응하는 것을 사용하며 설명할 수 있다. activity view controller를 사용하며 설명할 수 있다. mail compose view controller를 사용하며 설명할 수 있다. image picker view controller와 선택된 사진을 사용하는 법을 설명할 수 있다. Safari view controller를 통해 웹사이트를 표시하고 설명할 수 있다. Vocabulary handler 어떤 이벤트에 대해 대응하는 함수 클로져(코드블럭)이다. UIKit에 포함된 빌트인 된 UIViewController의 서브클래스들을 잘 활용한다면 편하게 앱 콘텐츠를 보여주고 접근하고 공유하는 등 여러가지 기능을 붙일 수 있게 된다. A..

식권계산기 - 제 2 화: 가격설정기능

1.1버전에서는 식권의 가격을 설정할 수 있는 기능을 추가했다. 닭 잡는데 소 잡는 칼을 쓰다 아주 단순한 값을 저장하는 것이라서 UserDefaults를 사용하면 된다는 것을 이제와서 알았다. 내가 했던 방법은 앱의 도큐먼트 폴더에 plist를 생성하여 저장할 값을 encoding, 불러올 때 decoding하는 Codable 프로토콜을 적용한 것이다. 사실 이 방법은 테이블뷰를 배울 때 처음 알게된 데이터 저장 방법이었고 UserDefaults라는 방법이 있다는 것은 다른 사람의 개인 프로젝트를 구경하며 알게되었다. 식권 가격과 같은 아주 작고 귀여운 데이터는 UserDefaults를 활용하는것이 맞을 것 같다. 기존 Codable 프로토콜을 사용한 것은 지우고 UserDefaults를 활용하여 코드..

데이터 저장: plist

개요 앱 샌드박스의 도큐먼트 폴더에 plist 파일에 사용자 데이터를 저장하는 방법에 대하여 프로세스 저장할 데이터 타입에 Codable 프로토콜 선언 데이터를 저장할 폴더 URL 오브젝트와 생성할 파일의 URL 오브젝트 준비 데이터 저장 메소드 구현 저장할 데이터 인코딩 인코드한 데이터를 앞서 생성한 파일 URL에 쓰기 저장을 실행할 위치에 저장 함수 구현 데이터 불러오기 메소드 구현 plist파일 오브젝트 생성 (첫 실행시 없는 파일이므로 if let, try?) 앞서 생성한 오브젝트 디코딩 변수에 디코딩한 데이터 넣기 불러오기를 실행할 위치에 불러오기 함수 구현 Codable Protocol 선언 PropertyListEncoder가 인코드하는 어떤 오브젝트든지 반드시 Codable 프로토콜을 따라..

Best Practices 2021.10.31

Sandbox의 Documents 폴더 접근하기

시뮬레이터로 앱 실행하여 Mac 폴더에서 확인 1. 디렉토리 정보 가져오기 func documentsDirectory() -> URL { // return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] // return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) return paths[0] } 2. 앱 실행 시 해당 정보 출력하기 3. 파인더 메뉴에서 "커맨드-쉬프트-G"를 누르..

Best Practices 2021.10.31

식권계산기 - 제 1 화: 출시

이전글 첫 출시 식권계산기가 앱스토어에 처음 올라간 모습은 특별한 디자인도 입히지 않은, 오직 4500원짜리 식권의 경우에만 그 쓸모가 있도록 출시되었다. 만들고 싶은 최종 모습을 떠올려봤을 때 해야할 일이 참 많다. [앱스토어 링크] MVP 당시의 기준에 MVP 버전이라 생각한 모습으로 서둘러 출시해버렸다. 이렇게 일단 마켓에 올려두면 업데이트할 의지도 생기고 공부할 목적의식도 생겨서 한 선택이었다. 다음 업데이트 회사마다 식권의 가격이 다를 것이고, 이 앱을 사용할 수 있는 사람을 단 한 명이라도 늘리고자 한다면 우선 필요한 기능일 것이다. 식권가격 설정 버튼을 누르면 팝업이 나오고, 팝업에서 가격 설정 후 확인을 눌러 설정을 완료하게끔 할 것이다.

Unit 4 - Lesson 5: Table Views

목표 테이블뷰에 dynamic 데이터를 제공하는 방법 테이블뷰에서 사용자 액션에 반응하는 방법 미리 정의된 UITableViewCell 스타일 사용하여 테이블뷰 구성하는 방법 테이블뷰 데이터 refresh 하는 방법 용어 accessory view 테이블뷰 셀이 가지고 있는 부가적인 정보 제공을 위한 뷰 index path 테이블뷰에서 cell의 section과 row를 identify하기 위해 사용됨 nested array collection 트리의 특정 node를 향한 path를 나타냄 table view 여러 아이템들을 리스트로 표시하기 위한 UI dequeue cell을 재사용하기 위한 선택과 준비 프로세스를 일컫는 말 테이블뷰가 특별한 caching 시스템을 사용하는데, 그건 바로 표시했던 ce..

백준 2884 - 다른 사람 코드 보기

https://www.acmicpc.net/problem/2884 2884번: 알람 시계 상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모든 방법을 동원해보았지만, www.acmicpc.net 문제 요약 시간/분 입력 시 45분을 뺀 결과를 나타내는 문제 내가 푼 방법 - 시간(H), 분(M) 각각 계산하기 분(M)이 45분 미만일 때 단순 뺄셈으로는 되지 않는다는 점을 바탕으로 로직 작성 import Foundation let line = readLine()! let lineArr = line.components(separatedBy: " ") var h = Int(lineArr[0])! va..