[iOS] Enterprise 규모 앱 환경 구성 – 2
이번 글에서는 기존의 프로젝트에서 Layer들을 어떤 순서로 나눠야 하는지 기술해보려고 합니다. 1. 라이브러리 모듈 일반적으로 프로젝트는 CocoaPods, Carthage 또는 Git Submodule로 외부 라이브러리를 가져다 사용하고, 라이브러리를 사용하는 곳에서...
이번 글에서는 기존의 프로젝트에서 Layer들을 어떤 순서로 나눠야 하는지 기술해보려고 합니다. 1. 라이브러리 모듈 일반적으로 프로젝트는 CocoaPods, Carthage 또는 Git Submodule로 외부 라이브러리를 가져다 사용하고, 라이브러리를 사용하는 곳에서...
이전에 개발했을 때는 프로젝트가 크질 않아, 개발자 수도 적고, 프로젝트에 많은 라이브러리들이 포함되어 있었습니다. 또한, 윗 개발자분들한테 그렇게 배우기도 했었고요. 현재 담당하고 있는 프로젝트는 기존에 혼자서 담당하거나 둘...
얼마 전에 전수열 님의 Let’s TDD 세미나를 듣고, 의존성을 깨는 것부터 시작해야겠다고 생각을 했습니다. 외부 라이브러리를 추가해야 하는 경우, 일반적(?)으로 메인 프로젝트에 바로 넣고 그 라이브러리의 헬퍼 클래스나...
Swift 4.1에서 JSONDecoder에 keyDecodingStrategy 이 추가되었습니다. 이 속성은 JSONDecoder가 어떤 키 전략을 따를지에 따라 Data로부터 Decoding을 가능하도록 해줍니다. KeyDecodingStrategy은 세가지 case가 있는데, useDefaultKeys, convertFromSnakeCase 그리고 custom(@escaping ([CodingKey]) ->...
Unit Test를 할 때, 네트워크는 어떻게 테스트해야 하나 문제에 봉착합니다. 진짜 네트워크 요청을 해야하는건가 아니면 데이터만 테스트 해야하는가 이렇게 말이죠. 둘 다 테스트를 할 수 있다면 어떨까요? 네트워크...
비장애인에게는 화면이 보이므로 원하는 정보를 받을 수 있지만, 장애인에게는 정보를 제공하기가 어렵습니다. 이를 VoiceOver Screen을 이용하여 접근성을 제공합니다. iOS 접근성 정리 주로 사용하거나 사용할 것들을 우선 정리하였습니다. Accessibility...
iOS 개발 중에 가장 번거로운 부분이 있는데 바로 서버와의 통신입니다. 서버에 요청하고 비동기로 응답값을 받아 처리해야하는데, 문제는 서버와 실제 통신을 해야 한다는 점입니다. 클라이언트는 다양한 경우를 만들어 서버에...
iOS 개발시 LLDB를 이용하여 디버깅을 하지만, 낮은 수준의 명령어들을 지원하기 때문에 조금은 불편한 점이 있습니다. 관련하여 Facebook에서 Chisel이라는 프로젝트를 통해 python을 이용하여 높은 수준의 명령어를 지원합니다. Install 일반적으로...
iOS 개발을 좀 더 잘하기 위해, 편하게 버그를 추적하기 위해 LLDB를 이용한 디버깅 방법을 기록합니다. Execution Commands Continue - 정지된 프로그램 실행을 재개함. (lldb) continue (lldb) c Step...
터미널에서 특정 폴더로 이동 후, VSCode를 실행하고자 할 때 code [Path]로 실행합니다. 만약 code가 없다면 ⇧⌘P를 눌러 Command Palette에서 Shell Command: Install 'code' command in PATH 를 통해...
Rx에서 가장 까다로운 녀석이 Error를 다루는 것이 아닌가 생각합니다. 특히나 UI에 연결한 스트림이 Error이 발생하면 스트림이 깨집니다. 처음 Rx를 다룰 때, 이 것을 생각하지 못하고 막 작성하다가 갑자기...
Swift에서 시퀀스를 다룰 때, lazy를 어떻게 써야하는지 몰라 사용을 거의 안했습니다. 하지만 적절한 곳에서 lazy를 사용한다면 연산을 덜 하면서 원하는 결과를 얻을 수 있습니다. LazySequence lazy는 다음과 같이...
iOS 개발에서 Objective-C에서 Swift로 넘어오면서 가장 체감을 많이 느끼는건 컴파일 시간입니다. 프로젝트의 크기에 따라 다르지만, Swift 소스만 수백 또는 천 개 이상 넘어가는 프로젝트인 경우는 컴파일 시간이 몇...
KeyPath를 이용한 Get Set Swift에서는 KeyPath를 String 형태가 아닌 KeyPath 클래스를 이용하여 정적으로 접근할 수 있습니다. struct A { var b: Int = 0 } 다음과 같은 구조체...
이번에 Pull Request를 올리면서 Gitlab Trigger를 통해 Lint를 돌리는 스크립트를 만들었습니다. 현재 Lint를 돌렸을 때, 변경사항들이 너무 많아 한번에 일괄 수정하는 것은 무리가 있는 것으로 판단하여 현재 Branch의...
일반적으로 개발 Target과 배포 Target이 분리되어 있는 경우가 많은데, 개발 Target으로 가끔씩 Release 빌드로 실행해야 하는 경우가 있습니다. 그런 경우, BreakPoint를 걸어나도 동작을 하지 않는다면 프로젝트 설정에서 다음...
Swift에서는 옵셔널의 값을 사용하기 위해 guard let 과 if let 사용을 권장합니다. let a: Int? = 1 if let _a = a { print(_a) // Output: 1 }...
Rx Observable 리팩토링 - Sink 이전 글에서 Observable를 구현하였습니다. protocol ObservableType { associatedtype E func subscribe<O: ObserverType>(observer: O) -> Disposable where O.E == E } final class Observable<Element>:...
이 글은 Rx를 알고 있거나, RxSwift 등의 사용에 경험이 있는 대상으로 작성된 글입니다. Rx 기본 요소 Event, Disposable, Observer, Observable 구현하기 1. Event Rx에서 Event는 next, error, completed로...
카메라 권한, 이미지 읽기, 쓰기 등의 권한을 얻으려면 비동기 방식을 사용합니다. PHPhotoLibrary.requestAuthorization({ (newStatus) in if (newStatus == PHAuthorizationStatus.authorized) { // Doing } else { // Doing } })...
Protocol Extension에 원하는 기능을 추가하는 경우 계산 속성 또는 함수들을 그룹화하여 접근하려면 다음과 같이 작성해야만 했습니다. protocol TestProtocol { func testFunction() } protocol TestType { var test: TestProtocol...
Codable Swift4에서 Codable이라는 프로토콜이 추가되면서 JSON 처리를 손쉽게 해줍니다. { "a": "aa", "b": "bb" } 위와 같이 정의된 데이터인 경우, 다음과 같이 타입을 정의할 수 있습니다. struct Sample1:...
앞의 글에서 그러한 현상이 어떻게 되는지 추론 및 Dispatch에 대해 알아보려고 합니다. Protocol 타입인 변수에 Extension에 구현된 메소드를 접근시 구조체나 클래스에 이름이 동일한 메소드가 호출되지 않고 Extension에 구현된...
Swift로 코드를 작성하다보면 Protocol Extension에 구현된 메소드 또는 계산 속성과 클래스 또는 구조체에 구현된 메소드와 계산 속성 이름이 같으면 어떻게 동작하지 라는 고민을 하게 됩니다. A라는 프로토콜에 foo라는...
Name Mangling은 단어 그대로 이름을 조각조각냄으로써 고유한 이름을 가짐 여부 문제를 해결합니다. 컴파일러로부터 만들어진 코드는 링커를 통해 다른 부분과 연결되는데, 링커는 각 프로그램 개체의 많은 정보가 필요합니다. 이는...
viewDidAppear는 화면이 완전히 나타났을 때, 호출됩니다. 하지만 처음으로 호출되었는지를 알기 위해 일반적으로 변수를 통해 상태를 관리합니다. 하지만 iOS 5.0 이후 버전부터는 isBeingPresented, isBeingDismissed, isMovingToParentViewController, isMovingFromParentViewController를 사용할 수 있습니다....