https://in.swiftui.wtf/great 조건식 보다는 모디파이어를 선호하라 - 애니메이션 보간 가능하게하고, 성능 향상에 도움이 됨 - 뷰 트리를 유지하는지, 바꾸는지의 차이 "브랜치는 훌륭하며, SwiftUI에는 이유가 있다. 하지만 불필요하게 사용될 때, 그들은 열악한 성능, 놀라운 애니메이션, 그리고 심지어 상태 손실을 초래할 수 있다. 브랜치를 도입할 때, 잠시 멈추고 여러 뷰를 나타내는지 아니면 같은 뷰의 두 상태를 나타내는지 고려하세요." 관련영상 https://developer.apple.com/videos/play/wwdc2021/10022/?time=1498 State and dependencies - let 을 우선으로 사용하라 - 부모 뷰로 부터 값을 전달 받고 이 값을 ..
AppStore의 App 탭의 각 섹션을 나타내는 뷰를 유사하게 만들어보고자 합니다. 요구 사항으로는 Scroll Snap이 가능하며, 스크롤시 양 옆의 콘텐츠 일부가 노출되어야 합니다. 일반적으로 해당 기능을 수행하는 뷰를 Carousel View라고 명칭하는 것 같습니다. Carousel View를 분석한 구조는 다음과 같습니다. - horizontal spacing: 콘텐츠 전체 영역이 시작되고 끝나는 지점을 정의합니다. - spacing: 각 콘텐츠 영역 사이의 마진 값 입니다. - visible rect: 부모 뷰에서 바라보는 사각형 영역 입니다. - scrollOffsetX: x축의 오프셋 값 입니다. Carousel View는 visible rect를 오프셋을 이동시키며 콘텐츠 뷰를 순서대로..
Sandboxed App iOS 앱은 샌드 박스에 의해 제한되므로 앱은 일반적으로 해당 앱에서 만든 파일에만 접근할 수 있습니다. (앱은 주소록 데이터 및 사진과 같은 특정 다른 파일에 접근할 수 있지만 해당 용도로 특별히 설계된 API를 통해서만 가능합니다.) 또한 iOS 기기에서 파일 보호가 활성화 된 경우 앱은 기기가 잠겨있을 때 특정 파일에 대한 접근을 차단하도록 선택할 수 있습니다 보안상의 이유로 iOS 앱과 파일 시스템의 상호 작용은 앱의 샌드박스 디렉토리 내에 있는 디렉토리로 제한됩니다. 새 앱을 설치하는 동안 설치 프로그램은 샌드박스 디렉토리 내에 앱에 대한 여러 컨테이너 디렉토리를 만듭니다. 각 컨테이너 디렉토리에는 특정 역할이 있습니다. 번들 컨테이너 디렉토리는 앱의 번들을 보유하고 데..
캐시란 캐시는 애플리케이션의 성능을 크게 향상시킬 수 있는 객체 또는 데이터 모음입니다. 캐시를 사용함으로써 계산 비용이 많이 들 수 있는 일시적인 데이터와 함께 자주 접근하는 객체를 저장할 수 있습니다. 캐싱된 객체를 다시 사용하면 해당 값을 다시 계산할 필요가 없기 때문에 성능상의 이점을 얻을 수 있습니다. 그러나 특정 상황에서 몇가지 가능한 단점 또한 존재합니다. 많은 대용량 데이터를 캐싱할 때 다른 애플리케이션을 위한 RAM이 남아 있지 않을 정도 많은 객체를 캐시할 수 있으며, RAM을 확보하기 위해 애플리케이션을 종료할 수 있습니다. iOS에서는 캐싱을 위한 NSCache 객체를 제공하며 생성 비용이 많은 객체를 임시로 저장할 수 있습니다. 이번 포스팅에서는 NSCache와 Purgeable ..
OptionSet 이란 OptionSet은 Enum 타입과 유사하지만 한 번에 둘 이상의 상태를 나타낼 수 있습니다. OptionSet 프로토콜을 준수하여 비트 마스킹이 가능하고 개별 비트 집합을 표현할 수 있습니다. 참고로 문서에 따르면 Apple SDK의 300개 이상의 타입에서 사용되고 있습니다. 서브 뷰의 autoresizing을 적용하려는 상황을 가정해보겠습니다. subview.autoresizingMask = [] subview.autoresizingMask = .flexibleTopMargin subview.autoresizingMask = [.flexibleLeftMargin, .flexibleTopMargin] OptionSet은 SetAlgebra 프로토콜을 준수하기 때문에 Set 자료..
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() 사용하기: 특정 조건이 참인지 확인하라...