OptionSet 이란 OptionSet은 Enum 타입과 유사하지만 한 번에 둘 이상의 상태를 나타낼 수 있습니다. OptionSet 프로토콜을 준수하여 비트 마스킹이 가능하고 개별 비트 집합을 표현할 수 있습니다. 참고로 문서에 따르면 Apple SDK의 300개 이상의 타입에서 사용되고 있습니다. 서브 뷰의 autoresizing을 적용하려는 상황을 가정해보겠습니다. subview.autoresizingMask = [] subview.autoresizingMask = .flexibleTopMargin subview.autoresizingMask = [.flexibleLeftMargin, .flexibleTopMargin] OptionSet은 SetAlgebra 프로토콜을 준수하기 때문에 Set 자료..
간단한 xcrun simctl 명령어를 통해 실행 중인 시뮬레이터의 앱 내 Document 폴더를 확인할 수 있습니다. 1. iOS 시뮬레이터를 실행합니다. 2. `xcrun simctl` 명령어를 사용하여 현재 실행중인 iOS 시뮬레이터 앱 폴더 경로를 확인할 수 있습니다. (my.app.identifier 대신 앱의 bundle ID를 입력합니다.) xcrun simctl get_app_container booted my.app.identifier data 3. 현재 실행중인 iOS 시뮬레이터 앱 폴더 경로로 이동 후 Document 폴더를 확인할 수 있습니다. cd $(xcrun simctl get_app_container booted my.app.identifier data) open . 출처 w..
Render loop란 유저가 앱과 상호작용하기 시작할 때, 새로운 프레임이 렌더링된다. (아이폰 또는 아이패드 유저는 60Hz 프레임 레이트를 갖는다. 각 프레임 시간은 16.67ms(1/60)이다.) 이렇게 화면에 새 프레임을 렌더링하는 주기를 “Render loop" 라고 한다. Render loop의 목적은 모든 뷰가 모든 프레임에 대해 의도한대로 표시되도록하는 것이고 이 구성 요소를 이해하면 레이아웃 변경과 같은 가능한 함정에 빠지지 않게 된다. 또한 중복 작업을 피하는 데 매우 유용하다. Render loop는 다음의 세 단계로 구성된다. 1. Update Constraints (레이아웃 계산) 2. Layout (이전 단계의 레이아웃 값을 뷰에 입력) 3. Display (레이아웃 bound..
description property var description: String { get } description 프로퍼티를 통해 인스턴스의 텍스트 표현을 할 수 있습니다. print(_:) 함수로 인스턴스를 출력하고자 할 때, 인스턴스의 description 프로퍼티를 사용합니다. 그렇다는 것은 인스턴스 내부에 description을 정의해주지 않아도 이미 구현이 되어있다는 것입니다. 예를 들면, CGFloat 데이터 타입에는 description property가 구현되어 있음을 확인할 수 있었습니다. extension CGFloat : CustomStringConvertible { /// A textual representation of `self`. public var description: S..
UITableView 또는 UICollectionView와 같이 콘텐츠 영역을 스크롤링 가능한 스택 뷰를 만들어보고자 합니다. Storyboard 구현 및 소스 코드 구현 방법을 차례대로 작성하였습니다. Storyboard 구현 1. Vertical StackView를 추가하고 StackView의 subviews로 4개의 이미지 뷰를 순서대로 추가합니다. 2. StackView를 선택하고 상단 메뉴에서 Editor > Embed In > Stack View 를 선택하여 ScrollView를 Embed 합니다. 3. StackView가 스크롤 뷰의 가로, 세로 영역에 맞게 떨어지도록 오토레이아웃을 설정합니다. StackView를 선택하고 오른쪽 하단 3번째 아이콘(Resolve Auto Layout Iss..
Autoresizing이란 개발자가 동적 레이아웃을 구성할 수 있도록 Apple이 도입한 예전 방식의 기능으로 부모 뷰가 커지거나 줄어듦에 따라서 서브 뷰의 크기나 위치를 조정하는 방식을 결정할 수 있다. Autoresizing은 6가지 속성의 유연성을 정의한다. - UIView.AutoresizingOptions.flexibleWidth - UIView.AutoresizingOptions.flexibleHeight - UIView.AutoresizingOptions.flexibleLeftMargin - UIView.AutoresizingOptions.flexibleRightMargin - UIView.AutoresizingOptions.flexibleTopMargin - UIView.Autoresizi..
진행중인 Xcode 프로젝트에서 뷰를 작성하면 레이아웃을 테스트하는 시간이 오래 소요될 가능성이 있습니다. 또한 뷰를 작성할 때, 기존 코드와 연관된 의존성이 생길 가능성이 있습니다. 이러한 부작용을 줄이고자 뷰를 작성하기전에 Playground 환경에서 뷰를 테스트가능한 환경을 만들어보고자 합니다. 새 Playground 프로젝트 생성하기 빈 프로젝트를 생성하고 page의 맨 위에 다음의 코드를 작성합니다. import PlaygroundSupport `PlaygroundSupport` 프레임워크는 라이브 뷰 기능을 제공합니다. 여기서 라이브 뷰는 작성한 코드를 실행해서 보여주는 역할을 합니다. 라이브 뷰 설정하기 라이브 뷰로 작업하기 위한 최소한의 설정이 필요합니다. import PlaygroundS..
Dynamic Type이란 > 사용자가 화면의 콘텐츠 크기를 사용자 정의할 수 있는 기능입니다. iOS 7 사용자부터는 설정>디스플레이 및 밝기>텍스트 크기 설정에서 폰트 크기를 조정할 수 있는 기능을 사용할 수 있습니다. 아이폰 기본앱인 메신저, 연락처, 달력, 건강 앱에도 dynamic type이 적용되어 있습니다. WWDC 17: Building Apps with Dynamic Types 발표에 따르면 dynamic type을 적용하기 위해서는 세 가지 목표가 있어야 합니다. 첫째, 텍스트는 유저가 읽기에 충분해야 한다. 둘째, 텍스트는 완전히 읽을 수 있어야 한다. 셋째, 모든 텍스트 크기에 대해 앱 UI가 아름다워야 한다. 다음은 UILabel을 사용하여 앱에서 발생할 수 있는 예시입니다. 첫 ..
오류 처리 방법 Swift에서 오류를 처리할 수 있는 방법은 다음과 같다. nil 또는 error enum case 사용하기: 오류 처리의 가장 간단한 형태는 오류가 발생한 함수로 부터 nil 또는 .error case (Result enum 타입을 반환 타입으로 사용하는 경우)를 반환한다. 많은 상황에서 정말 유용할 수 있지만, 지나치게 사용하면 사용하기 번거로운 API로 이어질 수 있고 또한 문제를 발생시키는 로직을 숨길 위험이 있다. throw Error 사용하기: caller가 do ~ try ~ catch 패턴을 사용하여 잠재적인 오류를 처리해야 한다. 또는 try? 를 사용하여 오류를 무시할 수 있다. assert()과 assertionFailure() 사용하기: 특정 조건이 참인지 확인하라...
Collection View는 레이아웃 객체와 직접적으로 작동하며 전체 레이아웃 프로세스를 관리한다. 레이아웃 프로세스에 사용되는 핵심 메서드는 다음과 같은 중요한 작업을 처리한다. 스크롤 가능한 내용 영역의 크기 지정 셀 및 뷰를 배치할 수 있도록 레이아웃을 구성하는 대한 attribute 객체를 제공 레이아웃 프로세스는 다음의 순서대로 수행된다. prepareLayout: 배치 정보에 필요한 초기 계산을 수행 collectionViewContentSize: 초기 계산에 따라 전체 콘텐츠 영역의 크기를 반환 layoutAttributesForElementsInRect: 지정된 사각형에 있는 셀 및 뷰의 속성을 반환 invalidateLayout: 레이아웃을 무효화한다. 레이아웃 준비 레이아웃 주기가 시..
프로세스 운영체제로부터 시스템 자원을 할당받는 작업의 단위 각각 독립된 메모리 영역(Code, Data, Stack, Heap 구조)을 할당받는다. 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다. 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다. 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC)을 사용해야 한다. (Ex. 파이프, 파일, 소켓 등을 이용한 통신 방법 이용) 쓰레드 프로세스 내에서 실행되는 여러 흐름의 단위 쓰레드는 프로세스 내에서 Stack을 따로 할당받고 Code, Data, Heap 영역은 공유한다. 쓰레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로 프로세스 내의 ..
운영체제가 하는 일 컴퓨터 시스템은 대개 하드웨어, 운영체제, 응용프로그램 및 사용자의 네 가지 구성요소로 구분된다. 운영체제는 사용자와 다양한 응용프로그램 간의 하드웨어 사용을 제어하고 조정한다. 즉, 실행중인 응용 프로그램들이 작업 수행에 필요한 CPU, 메모리, 입출력 장치 등의 하드웨어 자원을 할당하는 것을 제어한다. 컴퓨터에 대한 사용자의 관점은 사용되는 인터페이스에 따라 달라진다. 이러한 시스템은 한 사용자가 자원을 독점하도록 설계되었으며 목표는 사용자가 수행하는 작업을 최대화하는 것이다. 사용자 관점에서 운영체제는 대부분 사용의 편의성을 위해 설계된다. 그러나 일부 컴퓨터는 사용자의 개입 없이 작동하도록 설계되기도 한다. 시스템 관점에서 운영체제는 하드웨어와 가장 밀접하게 연관된 프로그램으로..