[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..
[Xcode] Thread Sanitizer - Race Condition 디버깅
·
iOS/Xcode
서론 최근 Xcode의 Thread Sanitizer 기능에 대해 알게 되었습니다. 직접 사용해보니 흥미로워서 공유 목적으로 포스팅 작성합니다. 그리고 혹시 Sanitizer라는 영단어를 들어보셨나요? 전 이번에 처음 들어봤는데요. 소독제, 살균제라는 뜻이더라고요. Thread를 소독해주는 기능(?)이라는 표현 같습니다 ㅋㅋ Race Condition TSan(Thread Sanitizer)는 런타임에 Race Condition을 탐지해 줍니다. 그래서 일단 Race Condition이 무엇인지 간단하게 살펴보도록 하겠습니다. Race Condition이란 현재 작업 이외의 또다른 작업의 타이밍(작업순서)에 따라 결과가 달라져 여러 결과를 만들어낼 수 있는 상황을 말합니다. 생김새가 비슷한 단어로는 Da..
[Swift] 꼬리 재귀(Tail Recursion)와 꼬리 재귀 최적화
·
Swift/개념 & 응용
꼬리 재귀(Tail Recursion) 꼬리 재귀란 재귀의 결과를 바로 반환하는 재귀 형태입니다. 말로 들으면 무슨 말인가 이해가 안 될 것이므로 코드로 알아보겠습니다. 아래 함수들은 단순히 1 ~ n까지의 합을 구하는 역할입니다. 먼저 일반 재귀 형태를 먼저 보겠습니다. func recursion(_ num: Int) -> Int { if num == 0 { return num } return num + recursion(num - 1) } 파라미터로 num을 전달 받고 num + recursion 결과를 반환합니다. 이 메서드 안에는 num + recursion 이라는 연산이 존재합니다. 연산이 존재하면 연산을 위한 값을 스택에 저장해야하기 때문에 재귀를 할 때마다 스택에 메모리 할당이 발생합니다. ..
[Swift] 정규표현식 사용해보기
·
Swift/개념 & 응용
서론 정규표현식 알아보기에 이어 두 번째 정규표현식 포스팅입니다. 아마 3편은 Swift 5.7의 RegexBuilder(https://developer.apple.com/documentation/regexbuilder)가 될건데요. 이건 아마 많이 늦을듯... ㅎ 최소 한 달? (부스트캠프 챌린지 끝나고요 ㅎㅎ) 아무튼, 오늘의 포스팅인 정규표현식 사용해보기는 지난 1편에서 알아봤던 정규표현식을 실제로 사용해보는 내용입니다. 문자열에서 정규표현식을 어떻게 사용하느냐에 대한 글이니 정규표현식에 대해 잘 모르신다면 1편을 먼저 봐주세요. 학습하면서 작성한 포스팅인 만큼 부족한 점이 있을 수 있습니다. 틀린 점, 부족한 점 댓글 달아주시면 즉시 수정하도록 하겠습니다. 테스트 데이터 아래 문자열과 정규식을 사..
[Swift] 정규표현식 알아보기
·
Swift/개념 & 응용
서론 최근 정규표현식이 많이 부족하다는 걸 느꼈습니다. 이번 기회에 제대로 알아보자! 결심하고 정규표현식에 대해 공부해봤습니다. 정규표현식 개념보다는 예제 위주로 포스팅을 작성하였습니다. 정규표현식 정규표현식(regular expression, regex)이란 사용자가 규칙을 세워 패턴을 정의해둔 문자열입니다. 정규표현식은 문자열의 일부나 전체가 패턴이 일치하는지 알아볼 수 있는 편리한 방법입니다. 패턴이 일치하는 문자열만 추출할 때, 문자열이 패턴과 일치하는지 알고 싶을 때 등의 상황에서 유용하게 사용할 수 있습니다. 정규표현식 문법 문법 기능 설명 . 문자 일치 개행 문자를 제외한 문자 1개와 일치 [ ] 문자 집합 : 를 여러 번 쓴 것과 동일함. 사이에 들어온 문자를 선택하고 - 기호를 통해 범위..
유정주
'SWIFT' 태그의 글 목록 (3 Page)