본문 바로가기

iOS10

[Swift] Copy-on-Write(CoW) 알아보기 Copy-on-Write Write가 발생했을 때 Copy를 수행한다. Copy on write는 데이터를 복사할 때 먼저 참조를 통해 불필요한 복사를 줄이고, 데이터 변경이 발생하는 경우에만 실제로 복사를 하는 리소스 관리 기법이다. 이는 원래 운영체제에서 프로세스에게 프레임을 할당할 때 메모리 공간 낭비를 막기 위해 사용되던 기능인데 Swift에도 비슷한 목적으로 적용되었다. 예를 들어 1000개의 요소가 있는 배열이 있고 해당 배열을 다른 변수에 복사해야 하는 경우 두 배열이 같더라도 Swift는 1000개 요소를 모두 복사하여 새로운 메모리 공간에 할당해야 한다. 이처럼 엄청난 양의 같은 데이터를 복사하는 것은 비용이 많이 드는 작업이며 낭비이다. 그래서 사용되는 것이 Copy on write이다.. 2022. 10. 2.
[iOS] leading, trailing과 left, right leading, trailing과 left, right의 차이점이 무엇일까? Apple은 공식적으로 left/right constraint 보다 leading/trailing의 사용을 권장하고 있다. left/rignt은 사용자가 보는 화면상의 왼쪽과 오른쪽 위치 속성이다. 반면에 leading/trailing은 reading direction의 시작과 끝을 나타내는 위치 속성이다. Reading Direction? 우리가 주로 사용하는 언어(한국어, 영어)는 왼쪽에서 오른쪽 순으로 읽는다. 이렇게 읽는 방향을 'reading direction'이라고 하는데 사용자가 설정한 언어에 의해 영향을 받는다. 글을 읽는 순서가 다르면 당연히 사용자 경험도 달라지기 때문에 아래처럼 다른 UI를 만나게 된다. 즉,.. 2022. 9. 30.
[Swift] Class와 Struct의 차이 Swift는 클래스와 구조체를 제공한다. 그렇다면 언제 구조체를 사용해야 하고 언제 클래스를 사용해야 할까? 클래스와 구조체의 가장 큰 차이는 '메모리 저장 방식의 차이'이다. 클래스(Class) - 참조 타입 (Reference Type) - 인스턴스 데이터는 힙(Heap)에 저장, 해당 힙을 가리키는 변수는 스택에 저장하고 메모리 주소값이 힙을 가리킨다. - 복사 시 값을 전달하는 것이 아니고, 저장된 주소를 전달한다. - 힙(Heap)의 공간에 저장, ARC 시스템을 통해 메모리를 관리한다. - 상속이 가능하다. 구조체(Struct) - 값 타입 (Value Type) - 인스턴스 데이터를 모두 스택(Stack)에 저장한다. - 복사 시 값을 전달할 때마다 복사본을 생성한다. (다른 메모리 공간 생.. 2022. 9. 29.
[Swift] 옵셔널 패턴(Optional Pattern) 옵셔널 타입(Optional Type)이 실제로 어떻게 구현되어 있는지 내부를 들여다보자. 옵셔널은 Enum(열거형) 타입으로 구현되어 있고, 두 가지 케이스를 가지고 있다. 값이 associated value 로 들어있는 some 케이스와, 값이 없는 none 케이스가 있다. 또한 Generic으로 선언되어 있어 Int, String 등 어떤 타입이든 가질 수 있다. enum Optional { case some(Wrapped) case none // nil } 열거형 케이스 패턴(Enumeration Case Pattern) 옵셔널 자체가 열거형이기 때문에 옵셔널은 아래와 같이 switch 구문을 통해 값이 있고 없음을 확인할 수 있다. let num: Int? = 10 switch num { cas.. 2022. 9. 28.
[iOS] Lottie Animation Color 수정(ColorValueProvider) iOS 앱 개발 중 다크모드 적용을 위해 애니메이션의 컬러를 변경해야 했다. Lottie 애니메이션은 런타임에 기본적으로 렌더링되므로 프로그래밍 방식으로 수정하는 것이 가능하다. Value Provider란, 개발자가 런타임에 애니메이션 속성을 쉽게 수정하기 위해 활용할 수 있는 클래스이다. Lottie 애니메이션 내의 모든 요소는 노드로 표시되며, 노드에 액세스하려면 해당 노드의 키 경로(key path)를 알아야 한다. print(AnimationView.logHierarchyKeypaths()) 1. AnimationView.logHierarchyKeypaths()로 경로를 확인한다. 모든 애니메이션의 주요 경로가 나열되어 있으므로 Value Provider를 사용하여 Lottie 애니메이션을 수.. 2021. 11. 30.
[Swift] 옵셔널 바인딩(Optional Binding) Optional 값이 있을 수도 있고 없을 수도 있다. Optional은 값이 대입되어 있거나, 아니면 아무런 값이 대입되지 않은 상태(nil)인 type을 말한다. String? 이라고 표현되면 해당 변수가 String을 갖고 있거나, 아무 값도 없는(nil) 상태라는 것이다. 이는 type casting이나 nil value 체크 등에 있어서 중요한 역할을 한다. Optional Unwrapping 옵셔널 값은 랩에 둘러싸여 있어 사용하기 위해서는 unwrapping 하는 과정이 필요하다. 강제 해제 (Forced Unwrapping) 아래와 같이 간단하게 !를 사용하여 forced unwrapping을 할 수 있다. 값이 있다는 것이 확실할 때 느낌표(!)를 쓰면 값을 제대로 출력할 수 있다. 하지.. 2021. 11. 24.
[iOS] 화면 터치, Return/Enter 시 키보드 내리기(Hide keyboard) 1. 화면 터치 UIViewController의 터치 관련 메소드 중에 touchesBegan 메소드가 있다. ViewController에 아래 코드를 추가하면 화면 터치 시 키보드가 내려간다. class ViewController: UIViewController { ... override func touchesBegan(_ touches: Set, with event: UIEvent?) { self.view.endEditing(true) } } 2. Return 키 화면 터치 외에도 TextField에서 입력을 완료한 후 Return 키를 눌렀을 경우 키보드가 내려가는 상황을 가장 많이 경험할 수 있다. TextField에서 키보드의 return 키를 누르면 resignFirstResponder()을 .. 2021. 11. 15.
[iOS] UISheetPresentationController로 Bottom Sheet 띄우기 UISheetPresentationController? 시트의 모양과 동작을 관리하는 프레젠테이션 컨트롤러이다. WWDC 2021에서 새로운 UISheetPresentationController를 사용하여 시트를 띄울 수 있는 방법을 제시했다. 새로운 UISheetPresentationController는 높이를 조정하고, 상단에 grabber를 추가하는 등 더욱 간단하게 구현할 수 있도록 해준다. How to use it 현재 ViewController에서 시트로 띄우고자 하는 다음 ViewController를 정의한다. class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } @IBAction.. 2021. 11. 15.
[iOS] Custom font 적용 안 될 때 해결 방법 문제 아래처럼 extension으로 UIFont를 정의하고 View에서 사용하고자 할 때 적용이 되지 않는다. extension UIFont { enum Family: String { case Bold, Light, Medium, Regular, Thin } static func noto(size: CGFloat, family: Family) -> UIFont! { return UIFont(name: "noto_sans_cjk_kr_\(family)", size: size) } } text.font = UIFont.noto(size: 16, family: .Regular) 해결 방안 1. Font 파일 안에 적용하고자 하는 폰트를 넣고 Target Membership 체크를 했는지 확인한다. 2. inf.. 2021. 11. 15.