0714 새싹 9회차 정리
iOS 앱 개발자 데뷔 과정 9회차
#0. Memo
- Storyboard Reference : 다른 스토리보드랑 연결하기
작업을 하다 보면 ViewController가 지저분하게 너무 많아진다거나, 스토리보드를 분류하고 정리하고 싶을 때가 있을 것이다.
그럴 때 새로운 스토리보드를 만드는 것까지는 쉽지만, 서로 떨어져있는 ViewController끼리 어떻게 연결해야 할까?
Storyboard Reference를 추가하면, 연결시킬 ViewController와의 창구 역할을 한다.
그리고 화면을 전환시키는 Action을 수행할 Button을 이 Storyboard Reference에 연결시키면, 연결된 ViewController와 같은 이름으로 바뀌는 것을 볼 수 있다.
- 첫 화면 정하기
이제 화면이 전환될 수 있게 연결시켜준 것 까지는 좋은데... 첫 화면은 어떻게 결정하는걸까?
여태까지는 Entry point가 첫 화면을 결정짓는다고 생각했지만, 스토리보드마다 Entry point는 하나씩 꼭 존재해야 한다.
사실 첫 화면은 Enrty point가 아니라 여기서 결정한다.
다크모드/라이트모드, 가로모드/세로모드 때 봤던 화면들이다.
여기서 원하는 스토리보드의 이름으로 변경해주면 적용이 아주 잘 되는걸 볼 수 있다.
- Opensource Library : 내가 구현하고 싶은 기능을 누군가가 이미 공유중이라면?
개발자 문화에서 이러한 오픈소스에 기여한 것은 커리어가 되기 때문에 여러 기능들이 공유되고 있다.
직접 구현하려면 오랜 시간이 걸릴 기능도 라이브러리를 잘 활용하면 시간을 많이 단축시킬 수 있다.
하지만 앱을 지속적으로 관리하기 위해서는 라이브러리를 덜어내는 작업도 필요하다.
그럼 이 라이브러리는 어디서 찾을 수 있을까?
기능/화면에 대한 오픈소스를 모아서 정리해놓은 awesome swift 에서 확인이 가능하다.
또, 잘 만들어진 어플들(대기업...)의 설정-정보 창에 가면 제공하는 Opensource License들을 볼 수 있다.
라이브러리를 다운받는 방법은 CoCoaPods, Carthage, SPM, Manually로 크게 4가지가 있다.
CoCoaPods는 거의 모든 라이브러리가 지원하기 때문에 접근성이 좋은 것이 장점이다.
SPM은 애플에서 지원하는 기능이기 때문에 지원하는 라이브러리가 늘고 있다. 속도가 빠르고 간단하다는 것이 장점이다.
Carthage와 Manually는 잘 사용하지 않기 때문에 생략하겠다.
해당 화면에서 화면 중앙의 +를 누르고 라이브러리의 URL을 붙여넣으면, 저렇게 버전을 선택할 수 있다.
보통은 Up to Next Major Nersion을 선택하는 것이 일반적이고, Exact Version을 선택하면 특정 버전을 다운받을 수 있다.
적용시키는 방법은 라이브러리마다 다른데, 공통적으로 적용시키고자 하는 View의 Inspector 영역에서 Class 지정을 해줘야 한다.
그리고 아래처럼 import나 그 외 특정 코드를 입력해야 한다면, 해당 오픈소스의 github를 참고해 차근차근 따라하면 된다.
매우 친절하게 정리가 잘 되어있는 오픈소스도 많지만, 아닌 경우도 많다고 하니 주의하자...!
- 라이브러리와 프레임워크의 차이 : 자율성 / 주도권
라이브러리란 필요한 기능들이 묶인 코드의 묶음으로, 효율적인 코드 작성을 위해 언제든지 필요한 곳에서 호출하여 사용할 수 있도록 Class나 Function으로 만들어진 것이다.
여기까지만 들으면 프레임워크랑 다를게 없는것같은데, 차이점은 뭐가 있을까?
프레임워크는 전체적인 흐름을 자체적으로 가지고 있어 정해진 프레임 내에서 작업이 이루어지는 반면, 라이브러리는 원하고자 할 때 필요에 따라 사용하고 직접 코드를 제어할 수 있다.
하지만 라이브러리와 프레임워크의 경계가 항상 명확하지는 않다고 한다.
- Project Settings : Clean Build Folder의 친구
빌드가 왠지 모르게 안될 때, 묘하게 무겁게 느껴질 때 자주 누르는 클린빌드...
알고보니 이 클린빌드에게도 친구가 있었다.
이 Project Settings를 누르면 오른쪽 화면이 나오는데, Advanced 버튼 우측 상단의 화살표를 누르면 Xcode의 파인더로 이동된다.
여기서 DerivedData 폴더 안의 내용들만 삭제해도 되고, 폴더 자체를 삭제해도 된다.(DerivedData는 삭제해도 바로 재생성된다)
처음으로 폴더를 삭제하면, 엄청나게 많은 양이 묵혀져있었구나... 하고 놀라게 된다.
- Update to Latest Package Versions : DerivedData 삭제 후, 오류가 난다면?
위의 방법대로 DerivedData를 삭제했을 때, 오류가 발생할 수 있다.
이 때 발생하는 오류는 데이터가 삭제되서가 아니라, 데이터간의 연결이 끊어졌기 때문에 발생한다.
그래서 이럴 땐 Update to Latest Packge Versions를 누르면 간단하게 해결된다.
#1. Checklist
- Storyboard Reference
#0. Memo Storyboard Reference : 다른 스토리보드랑 연결하기 참고
- Opensource License
#0. Memo Opensource Library : 내가 구현하고 싶은 기능을 누군가가 이미 공유중이라면? 참고
- Swift Package Manager
#0. Memo Opensource Library : 내가 구현하고 싶은 기능을 누군가가 이미 공유중이라면? 참고
SPM이 Swift Package Manager의 약자이다.
- Major / Minor / Patch
버전 규칙이다. 만약 버전이 3.14.5 라면, 앞부터 Major, Minor, Patch이다.
Major : 기존 버전 호환 X (뭔가 큰게 바뀌었을때…)
Minor : 기능의 추가/수정
Patch : 유지/보수와 버그 수정
- Class vs Struct
자세한 정리는 [0713 새싹 8회차 정리] https://eun-dev.tistory.com/10 에서 확인할 수 있다.
Inheritance : 클래스에서만 사용 가능
Override : 클래스에서만 사용 가능
Structure : 구조...?
Instance : 외부에서 클래스(구조체)의 멤버에 접근하고 사용하기 위해 초기화된 변수
Property, Method, Member : 클래스(구조체) 내부의 변수, 함수, 멤버(변수+함수)
IInitializer : 클래스 내부에 초기화가 되어있지 않은 프로퍼티가 있을 경우 사용해야 함
Default Initializer : 모든 프로퍼티에 기본값이 있을 경우 사용 가능
Memberwise initializer : 구조체에서만 사용 가능
Class는 프로퍼티를 var로 선언하면, 인스턴트를 let으로 초기화해도 값의 변경이 가능하다.
Struct는 프로퍼티를 var로 선언해도, 인스턴트를 let으로 초기화하면 값의 변경이 불가능하다.
- Any vs AnyObject
Any와 AnyObject 모두 여러 타입에 대해 대응할 수 있지만, 아래와 같은 차이가 있다.
Any : 구조체, 열거형, 클래스, 클로저 등 모든 타입에 대한 인스턴스를 담을 수 있다.
AnyObject : 모든 클래스 타입의 인스턴스만 담을 수 있다.
Any와 AnyObject 모두 어떤 타입으로 된 멤버를 가지고 있는지 컴파일 시점에서는 알 수 없으며, 런타임 시점에 타입이 결정되기 때문에 타입 캐스팅을 하지 않으면 각 멤버에 대한 접근도 불가능하다.
런타임 시점에 결정되기 때문에, 런타임 오류가 발생할 수 있어 사용 시 주의가 필요하다.
#2. Assignment
- 기념일 계산기 기능 구현하기
오늘 과제는 DatePicker가 ValueChanged 되면, 날짜를 계산하여 레이블에 반영하는 것이다.
대충 완성하는 것까지는 성공했는데, 날짜를 로컬라이징 하는 과정에서 문제가 발생했다.
DatePicker가 표준시 기준으로 나와서 날짜 계산이 어긋나니까, Locale을 이용했는데...


다시 Date 타입으로 바꾸는 과정에서 어디가 잘못된건지 계속 nil이 떠버린다...
계속 해결하려고 이것저것 해보다가 도저히 안돼서 오늘은 일단 기능을 구현했다는 것에 의의를 두기로 했다.
하지만 그대로 끄기는 조금 아쉬워서, Alert을 이용해서 기념일을 저장할 보관함을 선택할 수 있게 구현해보았다.

Alert에 대해 배우고, 코드를 작성해보기는 했지만 handler는 계속 nil로 두었어서 실제로 동작하게 하는데 삽질을 꽤 했다ㅎㅎ;
그래도 한번 써보니 공부가 많이 되는 것 같아서 뿌듯했다.
함수를 기능별로 깨끗하게 정리해서 쓰고 싶은데, 자꾸 스코프가 꼬여서 그냥 Action함수 안에 싹 다 넣어주었다.
일단 기능을 구현하는게 중요하니까...!
# 그 외
- 이번에 사용해본 Opensource Library
FSCalendar : https://github.com/WenchaoD/FSCalendar
SideMenu : https://github.com/jonkykong/SideMenu
TextFieldEffects : https://github.com/raulriera/TextFieldEffects
IQKeyboardManager : https://github.com/hackiftekhar/IQKeyboardManager
모두 유명하지만, 특히 IQKeyboardManager는 모르면 간첩이라고 한다.
awesome swift : https://github.com/matteocrippa/awesome-swift