[Swift] 구조체와 클래스의 Property Observer 동작 차이 (짧은글)
·
Swift/개념 & 응용
Property Observer Property observers observe and respond to changes in a property’s value. Property observers are called every time a property’s value is set, even if the new value is the same as the property’s current value. Property Observer는 프로퍼티의 "값"이 변하면 호출됩니다. 여기서 "값"의 의미때문에 구조체와 클래스의 프로퍼티 옵저버 동작 차이가 발생합니다. struct StructA { var value: Int = 0 } class ClassA { var value: Int = 0 } var struc..
[Swift] OptionSet 알아보기
·
Swift/개념 & 응용
OptionSet OptionSet은 비트 마스크를 이용해 여러 옵션을 다룰 때 채택하는 프로토콜입니다. 프로토콜이지만 이름에 Set이 붙은 거처럼 분류도 Collections로 되어 있고, intersection, union 등 집합 메서드도 사용할 수 있습니다. (이건 아래에서 더 자세히 알아볼게요.) OptionSet이 낯설 수 있는데요. 생각보다 많은 곳에서 사용됩니다. 대표적으로 UIView.AnimationOptions, UIView.AutoresizingMask가 있습니다. OptionSet 사용법 struct ShippingOptions: OptionSet { let rawValue: Int static let nextDay = ShippingOptions(rawValue: 1
[iOS] WWDC21 테크톡 - Find and fix hitches in the commit phase
·
WWDC/iOS
서론 WWDC21 테크톡 - Find and fix hitches in the commit phase에서는 Commit phase의 hitch를 찾고 고치는 내용을 다룹니다. hitch와 commit phase가 무엇인지는 WWDC21 테크톡 - Explore UI animation hitches and the render loop를 확인해 주세요. What is a Commit Transaction 터치 이벤트를 받으면 UI를 업데이트하게 됩니다. 시스템은 레이아웃이나 디스플레이 변경이 필요한 서브 뷰들을 기록합니다. 그리고 다음 Commit phase에서 시스템에 의해 draw와 layoutSubviews가 호출되면서 업데이트 됩니다. Commit Transaction은 4단계로 이루어집니다. lay..
[iOS] WWDC21 테크톡 - Explore UI animation hitches and the render loop
·
WWDC/iOS
서론 WWDC21 테크톡 - Explore UI animation hitches and the render loop에서는 hitch와 render loop가 무엇인지 알아보고, hitch의 종류, hitch를 측정하는 방법에 대해 알아봅니다. 이번 포스팅에서는 측정하는 방법까지만 다루고, 다음 포스팅인 Find and fix hitches in the commit phase에서 hitch를 제거하는 방법을 알아보겠습니다. What is a hitch 앱에서 애니메이션은 사용자와 앱 사이의 시각적 연결을 도와줍니다. 예를 들어, 사용자가 손가락을 화면을 쓸어넘기면 화면이 변해야 합니다. hitch는 예상보다 늦게 화면에 나타나는 프레임으로, 다음 프레임의 생성이 늦어져 애니메이션이 끊기는 시간입니다. hi..
[iOS] Alert 개선 과정 단계별로 살펴보기
·
iOS/개념 & 개발
서론UIAlertController는 보일러 플레이트가 생기기 쉽습니다.UIAlertController 생성UIAlertAction 생성present위 세 가지 로직이 반복적으로 사용되기 때문입니다. 메서드로 분리할지라도 UIAlertAction 생성에 중복 코드가 생기고, 그게 아니라면 메서드 파라미터가 많아집니다. 이번에는 Wrapper를 사용해 선언형 구조로 Alert를 깔끔하게 정리해 보겠습니다. 많이 고민하며 진행했지만 잘못된 부분이 있을 수 있습니다. 댓글로 피드백 꼭 부탁드립니다. 전체 코드는 아래 링크에서 확인 가능합니다. https://github.com/jeongju9216/SwiftPractice/tree/main/ExampleAlertWrapper/ExampleAlertWrapper..
[Swift] Equatable의 Synthesized Conformance 분석
·
Swift/개념 & 응용
서론 구조체와 클래스의 프로토콜 자동 준수 메커니즘 (w. ChatGPT)에서 Synthesized Conformance를 가볍게 다뤘습니다. 이번 포스팅에서는 SIL, CPP 코드를 분석해 Equatable의 Synthesized Conformance가 진행되는 과정을 알아보겠습니다. Equatable Equatable은 == static 메서드를 준수해야 하는 프로토콜로 == 연산자의 좌변과 우변을 비교해서 같은지 확인해 주는 역할입니다. 그리고 Synthesized Conformance를 지원하는 프로토콜 중 하나죠. Equatable은 아래 상황에서 Synthesized Conformance를 지원합니다. 구조체가 Equatable을 준수하는 저장 프로퍼티만 가지고 있는 경우 열거형의 모든 케이스..
[Swift] 구조체와 클래스의 프로토콜 자동 준수 메커니즘 (w. ChatGPT)
·
Swift/개념 & 응용
서론 최근 Equatable, Hashable, Comparable을 복습하면서 궁금한 점이 있었습니다. 왜 구조체는 채택만 해도 자동으로 준수가 되는데 클래스는 직접 요구 메서드를 구현해야 하는 걸까?입니다. Value 타입과 Reference 타입의 차이와 연관이 있다는 건 추측할 수 있었지만, 명확한 이유를 찾긴 어려웠습니다. 그래서 이번에는 ChatGPT와 함께 문제를 해결해 보았습니다. 스텝 바이 스텝으로 대답이 정확해지는 과정이 재밌어서 이렇게 포스팅으로 남겨봅니다. 1. 일단 질문하기 일단 큰 고민 없이 물어봤습니다. 그럴듯한 대답이 나왔습니다만, "값 타입이 프로토콜을 채택만 해도 되는 이유"에 대한 답은 아니었습니다. 2. 클래스와 비교하여 질문 다음은 클래스와 비교해서 질문했습니다. 이..
[iOS] Jeongfisher 4. Extension Wrapper와 파라미터 고민
·
iOS 프로젝트/Jeongfisher
GitHub - jeongju9216/Jeongfisher: 유정주의 이미지 캐시 라이브러리 유정주의 이미지 캐시 라이브러리. Contribute to jeongju9216/Jeongfisher development by creating an account on GitHub. github.com Extension Wrapper Extension Wrapper는 최근에 포스팅을 했었죠? (Generic, Protocol을 이용한 Extension Wrapping) Jeongfisher에서 적용을 해서 공유하고 싶은 마음에 포스팅을 작성했었습니다 ㅎㅎ 이번 포스팅에서는 Jeongfisher에 Extension Wrapper를 적용하면서 어떤 고민을 했는지 작성해보겠습니다. 참고로 이번 포스팅에서 구현 방법은..
[iOS] Jeongfisher 3. JFImageDownloader, 중복 Request 처리
·
iOS 프로젝트/Jeongfisher
GitHub - jeongju9216/Jeongfisher: 유정주의 이미지 캐시 라이브러리 유정주의 이미지 캐시 라이브러리. Contribute to jeongju9216/Jeongfisher development by creating an account on GitHub. github.com JFImageDownloader JFImageDownloader는 URL을 이용해 이미지를 다운로드하는 클래스입니다. 메모리 캐시와 디스크 캐시에 데이터가 없을 때 JFImageDownloader를 이용해 네트워킹을 하는 거죠. 이미지 다운로더를 만들면서 힘들었던 것은 중복 Reqeust 처리입니다. 동일한 URL로 여러 번 Reqeust를 하면 비효율적이겠죠? 그래서 URL을 딕셔너리에 저장해 두고 중복 Req..
[iOS] Jeongfisher 2. 메모리 캐시, 디스크 캐시
·
iOS 프로젝트/Jeongfisher
GitHub - jeongju9216/Jeongfisher: 유정주의 이미지 캐시 라이브러리 유정주의 이미지 캐시 라이브러리. Contribute to jeongju9216/Jeongfisher development by creating an account on GitHub. github.com 서론 Jeongfisher는 메모리 캐시와 디스크 캐시를 사용합니다. 이번 포스팅에서는 두 개의 캐시를 구현하면서 고민한 내용을 적어보려고 해요. 특히 메모리 캐시를 구현할 때 기초적인 내용을 깊게 고민할 수 있었습니다. 메모리 캐시 구현 이유 메모리 캐시는 NSCache를 사용하는 대신 직접 구현했습니다. 메모리 캐시 구현 과정을 직접 고민하고 싶었기 때문입니다. NSCache를 사용하면 물론 편하겠지만... ..
[iOS] Jeongfisher 1. 라이브러리 첫 도전, 다운샘플링 적용 결과
·
iOS 프로젝트/Jeongfisher
GitHub - jeongju9216/Jeongfisher: 유정주의 이미지 캐시 라이브러리 유정주의 이미지 캐시 라이브러리. Contribute to jeongju9216/Jeongfisher development by creating an account on GitHub. github.com 라이브러리 첫 도전 Jeongfisher는 저의 라이브러리 첫 번째 라이브러리입니다. 유명 라이브러리인 Kingfisher는 다들 아시죠? 이미지 캐싱, 다운로드, 편집 등 기능이 매우 많고 유용한 라이브러리입니다. 하지만 대부분의 앱에서는 이미지를 보여주고 캐싱하는 기능만 사용하는데요. 이점을 생각해서 Jeongfisher를 만들어보았습니다. 또한, 킹피셔는 하위 호환성을 고려해서 completionHandle..
[Swift] Optional.swift 살펴보기
·
Swift/개념 & 응용
Optional.swift를 살펴보게 된 계기 옵셔널은 Swift의 장점 중 하나입니다. 백준 문제를 풀다가 문득 nil 병합 연산자(??)에 대해 궁금해졌습니다. 일반적인 연산자는 즉시 연산이 완료되는데, ?? 연산자는 앞의 수행 결과가 nil인 경우 실행이 되는 부분이 흥미로웠어요. 어떻게 구현되었길래 지연 실행이 되는거지? 라는 생각이 들었습니다. 많은 블로그에서 이미 다룬 주제지만, 실제 구현 코드가 궁금해서 Optional.swift를 살펴봤는데요. 보기 전에는 너무 어려워서 못 읽을 줄 알았지만 막상 보니 읽을만 한거에요..? 그래서 한 번 쫙 읽고 포스팅으로 정리까지 하게 되었습니다 ㅋㅋ 전부 다루는건 아니기 때문에 Optional.swift와 함께 보시면 좋습니다. 기본 구조 @frozen..
[Swift] Generic, Protocol을 이용한 Extension Wrapping
·
Swift/개념 & 응용
Extension Wrapping Extension Wrapping은 유명 라이브러리에서 자주 보이는 구조입니다. (참고로 Extension Wrapping은 정식 명칭이 아니라 제가 임의로 정한 이름입니다.) 대표적으로 Kingfisher, RxSwift가 있습니다. imageView.kf.setImage(with: url) Kingfisher 메서드를 사용할 때 UIImageView가 아니라 kf를 이용해 메서드를 호출하죠? 바로 그게 Extension Wrapping입니다. Extension으로 구현한 Kingfisher 메서드를 UIView에서 직접 호출하지 않고, KingfisherWrapper로 호출하는 것입니다. Extension Wrapping 장점 Extension Wrapping은 안정..
[Swift] Failable Initializer (실패 가능한 초기화)
·
Swift/개념 & 응용
Failable Initializer Failable 초기화는 실패가 가능한 초기화입니다. 클래스, 구조체, 열거형에서 실패 가능한 초기화를 정의할 수 있습니다. Failable 초기화 예시 실패가 가능한 초기화는 특정 조건에서만 객체가 생성되어야 할 때 유용합니다. class Time { var hour: Int var minute: Int } 예를 들어, Time 클래스는 hour와 minute 변수가 있습니다. hour의 범위는 1~12여야 하고, minute은 0~59여야 합니다. 이외의 숫자가 들어오면 객체가 생성되지 않도록 하고 싶을 때 Failable 초기화를 사용할 수 있습니다. class Time { var hour: Int var minute: Int init?(hour: Int, mi..
[Swift] memberwise 초기화, convenience 초기화
·
Swift/개념 & 응용
서론 Swift에서 구조체와 클래스는 많은 차이가 있고, 초기화도 그중 하나입니다. 구조체는 멤버와이즈(memberwise) 초기화를, 클래스는 편의(convenience) 초기화를 가지고 있죠. 초기화에 대해 할 말은 굉장히 많지만, 이번 포스팅에서는 멤버와이즈(memberwise) 초기화와 convenience 초기화에 집중해서 알아보겠습니다. 초기화(Initializer) 초기화란 구조체, 열거형, 클래스의 인스턴스를 생성하는 것입니다. 초기화의 역할은 모든 프로퍼티를 기본값으로 초기화하는 것입니다. 만약 초기화가 끝나는 시점에 모든 프로퍼티가 기본값을 가지고 있지 않다면 초기화가 실패됩니다. (여기서 언급한 초기화의 역할은 아래에서도 꾸준히 언급되므로 알아두시면 좋겠습니다.) Default Ini..
유정주
'ios' 태그의 글 목록 (3 Page)