🍎 iOS

    인스타그램 스타일 Page Control

    인스타그램 스타일의 페이지 컨트롤을 만들려고 했다. UIPageControl 처음엔 UIPageControl 을 이용해서 만들려고 했지만, 보여 줄 수 있는 점의 개수와 종류를 지정할 수 없음 점의 크기를 지정할 수 없음 위의 두가지 이유로 UIPageControl 을 사용할 수 없었다. UIControl 애초에 UIPageControl 이 UIControl을 상속하고 있기 때문에, UIControl을 상속해서 만들어 보았다. UIControl 공식 문서 공식 문서를 보면, UIControl 은 버튼이나, 슬라이더, 텍스트 인풋 같이 유저가 인터렉션 할 수 있게 하는 요소들이 상속을 받고 있다. UIControl은 사용자 인터페이스 요소를 구성하고 사용자의 상호작용을 처리하는 데 사용되는 클래스이다. U..

    [UIKit] App life cycle 이란?

    🚴🏻 app life cycle 이란? app 의 life cycle 이라는 것은 앱의 생명 주기를 의미한다. 우리 앱이 켜지고, 데이터 들이 메모리의 올라가고, 앱을 끈 것은 아니지만 다른 앱을 사용하고 있고, 결국에는 앱을 종료하게 되는 이 주기를 말한다. 애플에서는 이러한 상태에 맞춰서 호출 되는 메서드들을 정의해 놓았다. 그래서 어떤 메서드가 언제 호출 되는지 알고 있다면, 그 상태에 맞는 적절한 대응을 해줄 수 있다. (예를 들면 앱이 꺼지기 전에 데이터를 저장 한다든지 하는...) 📱 앱의 상태 Not Running 앱이 시작되지 않았거나 실행되었지만 시스템에 의해 종료된 상태 Inactive 앱이 전면에서 실행 중이지만, 아무런 이벤트를 받지 않고 있는 상태 Active 앱이 전면에서 실행 ..

    [swift]Date DateFormatter CheetSheet

    Date와 DateFormatter 에 대한 내용을 가끔 쓰는데 쓸때 마다 조금씩 헷갈려서 내용을 정리해 두려고 한다. 고고 📅 Date란? struct Date A specific point in time, independent of any calendar or time zone. 시간의 특정한 포인트로, 어떠한 캘린더나 타임존으로 부터 자유하다고 한다. 그래서 지금 시간을 찍어보면 Date 를 찍어보면 이런 식으로 나온다. 2022-10-01 11:40:34 +0000 년도-월-일 시간:분:초 +시간대 이런 포멧이다 사실은 지금이 8시 인데 11시 로 나오는 이유는 표준 시간대(UTF)를 사용하기 때문이다. (그래서 영국 시간 기준인가? 봤더니 지금 영국도 써머타임 때문에 저 시간에서 약간 오차가 있..

    [WWDC19] SwiftUI Essentials

    이글은 WWDC19 SwiftUI Essentials 을 보고 정리 한 글 입니다. 🎁 intro SwiftUI 는 바퀴를 재발명하려고 하지 않는다. 우리가 전에 UIKit 에서 사용하던 다양한 컴포넌트들 그리고 다양항 기능들이 이미 모두 들어가 있다. 그저 방법을 바꿨을 뿐이다. 기본적인 것은 쉽게 구현할 수 있게 도와주고 자유롭게 커스텀 할 수 있도록 만들었다고 한다. 🥑 View and modifiers 아보카도 토스트 주문 앱을 만들면서 SwiftUI와 친해져 보자. 이 화면에서 보이는 모든 것은 View 로 구성되어 있다. 이 말을 이해하기 위해서 이야기를 더 들어보자. 일단 UIKit 에는 UIView 가 있고 AppKit 에는 NSView 가 있다. SwiftUI 에는 View 가 있다! S..

    [swift]@property wrapper

    combine을 공부하면서 Published 의 구현부를 뜯어보는데 @propertyWrapper struct Published @propertyWrapper 라는 것이 있는 것을 보았다. 많이 들어본 것 같았는데... 저게 뭘까? @propertyWrapper 를 먼저 공부해 보자! 🎁 @property wrapper 란? @propertyWrapper 공식문서 @property wrapper 공식문서가 language guide 에 있는게 조금은 충격이었다. language guide 열심히 읽었어서 다 아는 내용인줄 알았는데... 놓친게 있다 다시 한번 읽어야 할듯...ㅎ 공식문서에 씌여 있는 정의를 보자. property wrapper는 프로퍼티가 저장되는 방법을 관리하는 코드와 프로퍼티를 정의하..

    [iOS] 키보드야 텍스트 가리지마

    키보드를 보이게 하는데에 다양한 방법이 있다. 내가 시도해본 방법으로는 view 의 frame 을 변경하는 방법 view 의 autolayout 을 변경하는 방법 view 의 contentInset 을 변경하는 방법 keyBoard autolayout 활용하기 (iOS15 부터 가능) 들이 있다. 하나 하나 시도를 해보자. 우선 1~3 3가지 방법은 아주 약간만 다르고 방법이 비슷하다. 4번은 새로나온 아주 쉬운 방법이다. 1~3 방법을 먼저 구현해보자 ⌨️ 키보드 내리기 우선 일반적인 앱은 textFied 나 textView 가 아닌 곳을 터치하면 입력이 끝났다고 생각하고 키보드가 내려간다. 이것을 구현해보자. ViewController 에 아래 두가지 메서드를 구현한다. private func set..

    [swift] 의존성 주입으로 코드를 예쁘게 하자!

    🤔 의존성 주입을 하는 이유? 의존성 주입을 알아보기 전에 의존성 주입이란 것을 왜 해야하는 것일까? 객체끼리의 의존도가 높으면 한 객체에서 수정이 일어나게 되면 연관된 모든 객체를 손봐야 하는 경우가 있다. Unit test 를 할 경우에도 한 객체의 Test 만 진행하고 싶은데 의존도가 높으면 그럴 수가 없다. 유지보수를 편리하게 하기 위해서라도 의존성 주입을 하면 장점이 많이 생긴다. 💙의존성 주입의 장점💙 객체간의 의존성을 줄여준다. Unit Test가 용이해진다. 코드의 재활용성이 올라간다. 유지보수에 좋다. 그럼 의존성 주입이 무엇인지 알아보자. 😘 의존성 (Dependency) struct Coffee { let name: String } struct Store { let baverage: ..

    [iOS]사용자의 폰트 사이즈 정보에 따라 UI 바꿔주기

    📱 사용자의 폰트 사이즈 정보에 따라 UI 바꿔주기 웨더의 추천으로 어떤 블로그에서 접근성 설정을 하지 않는 것은 인종차별을 하는 것과 마찬가지다 라는 글을 읽었다. (아래 링크를 달아두었다.) 어떤 의미로 이런 제목을 다셨는지는 이해가 되었다. 실제로 아이폰에서 그런 부분들에 대한 지원이 다른 OS 에 비해서 좋아서 많은 장애인 분들이 아이폰을 사용한다는 이야기를 들었다. Font 사이즈에 대한 접근성을 설정해 주면 사용자의 설정에 따라 Font 사이즈를 줄 수 있다. 그런데 사실 그렇다 보면, 특정 크기 이상 폰트를 키웠을 때 UI 요소가 깨지거나 아주 이상하게 나오는 경우를 볼 수 있다. 사실 Font 에 대한 접근성을 지원한다면 사용자가 폰트 크기를 어떻게 설정하든지 간에 화면에서 보이기에 깔끔해..

    [iOS] 컴파일 최적화 feat 꼬리재귀

    🛠 컴파일 최적화 ⚙️ 컴파일 최적화란? 위키에서 말하는 컴파일 최적화의 정의를 찾아보았다. 컴파일러 최적화(optimizing compiler)는 컴파일러에서 출력되는 실행 프로그램의 효율성을 최적화하는 과정을 말한다. 일반적으로 프로그램의 실행 속도를 최대화하거나 프로그램이 차지하는 메모리의 양을 최소화하기 위해 많이 이용된다. 휴대용 컴퓨터가 성장함에 따라 프로그램에 의해 소비되는 전력을 최소화하는 것도 고려된다. 내가 이해하기로는 각 언어의 컴파일러 마다 어떤 경우일 때 최적화를 할 수 있다는 규칙이 있는 것 같다. 예를 들어 final 을 붙이는 것도 final 키워드를 붙이면 컴파일러가 상속되지 않는다는 것을 인지하고 static dispatch 로 바꿔주는 과정이 컴파일 최적화를 해주고 있는..

    [WWDC] ARC in Swift: Basics and beyond

    swift 의 class 는 Referance 타입이고, ARC 를 통해서 메모리를 관리하기 때문에 ARC 를 알아야 한다고 한다. 💾 ARC의 객체 수명 object life time and ARC RC 는 init 되는 시점에 1이 된다. 객체의 생명주기는 init 을 할 때 시작되고 마지막 사용이 끝난 뒤에 해제 된다. ARC 가 retain 과 release 를 자동으로 넣어준다. ARC 를 사용하기 전에는 retian 과 release를 사용해서 사용자가 RC 를 올려주고 내려주는 작업을 했다. ARC 를 사용한 이후로 컴파일러가 코드를 읽고 적당한 부분에 retain 과 release 를 삽입해주고 있다. 자 wwdc 에서 보여준 예제를 보자. class Traveler { var name: ..

    [swift] 부동 소수점 오류가 나는 이유

    🎲 컴퓨터가 정수를 표현하는 방법 Integers (정수) 소수점이 없는(분수 부분이 없는) 숫자를 의미 한다. swift 의 Int는 크기에 따라 다양한 타입을 제공한다. Int 가 컴퓨터에 어떤 형식으로 저장 되는지보자. print("Int8 max: \(Int8.max)") print("Int8 min: \(Int8.min)") print("UInt8 max: \(UInt8.max)") print("UInt8 min: \(UInt8.min)") //Int8 max: 127 //Int8 min: -128 //UInt8 max: 255 //UInt8 min: 0 Int8 과 Uint8 의 최대값과 최소값을 찍어보았다. 우선 여기에서 뒤에 붙은 8은 비트의 수를 의미한다. Int8 이라는 것은 8비트를 ..

    [swift] 고차 함수 요목조목 보기

    🎛 고차함수란? 고차함수는 다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수 이다. → 클로저를 파라미터로 받거나 → 클로저를 리턴하는 경우 Foundation 에서 기본으로 제공하는 고차함수에는 map, compactMap, flatMap, filter, reduce 등이 있다. 🗺 map 기존 데이터를 변형(transform) 해서 새로운 컨테이너에 담아주는 고차함수이다. map 은 파라미터로 클로저를 받는다. 여기에서 받는 클로저는 시퀸스의 요소들을 파라미터로 가지고 있어야 하고, 요소를 변형해서 반환한 것을 리턴해야 한다. 예시를 보자. [0, 1, 2, 3, 4] → [0, 2, 4, 6, 8] 배열의 요소를 2배 곱해주는 로직이다. let numbers: [Int] = [0..

    [iOS] Number Fomatter

    📋 Fomatter 란? 값을 다양한 텍스트 값으로 변환해 줄 수 있는 추상 타입이다. class Formatter : NSObject Foundation 에서 지원하는 Fomatter 포멧 설명 ByteCountFormatter 바이트값을 KB, MB, GB 등으로 변환해줌 DateFormatter 날짜를 변환해줌. DateComponentsFormatter "약 5분 남음" 같은 문자열을 만들어 반환해줌 DateIntervalFormatter 시간 사이 간격을 문자로 반환해줌 MeasurementFormatter 수치를 문자로 반환해줌 NumberFormatter 숫자를 문자로 반환해줌 PersonNameComponentsFormatter 사람의 이름을 정해진 규칙에 따라 반환해줌 이런 다양한 포메터..

    [swift] Subscript 구현하기

    🤔 Subscript란? [ ] 을 이용하여 (단축키 처럼)값에 접근할 수 있도록 해주는 문법이다. 우리가 Array에서 [index] 를 사용해서 접근하거나, Dictionary 에 [key] 값으로 접근 했던 문법들은 subscript 로 구현되어 있는 것이었다. 클래스, 구조체, 그리고 열거형은 콜렉션, 목록, 또는 시퀀스의 멤버 요소에 서브스크립트를 구현해 줄 수 있다. 📖 Subscript 문법 subscript(index: Int) -> Int { get { // Return an appropriate subscript value here. } set(newValue) { // Perform a suitable setting action here. } } 연산 프로퍼티의 문법과 아주 유사하다...

    [WWDC] Architecting Your App for Multiple Windows

    이 글은 wdc 2019 Architecting Your App for Multiple Windows 보고 생각을 정리한 글 입니다. 🗒 간단 요약 ios13 부터 mutifle window 를 적용 함에 따라서 App delegate에서 하던 일을 App delegate가 Scene delegate 나누어서 한다. App life cycle, Scene life cycle 을 자세히 보면 이렇다. Scene 의 sync 를 맞추려면 지금까지와는 다른 구조로 짜야 한다. 자세하게 보도록 하자. 🤔 App degate 와 Scene delegate 가 나뉜 이유 ios12 까지는 process Lifecycle 과 UI lifecycle 을 모두 app delegate 에서 처리했다. 그럼에도 아무런 불편..

    [swift] String.Index 는 무엇일까?

    🧐 String.Index 타입이란? 스위프트에서는 String 타입의 인덱스를 나타내기 위해서 Int 를 사용하지 않고 String.index 라는 특수한 타입을 사용한다. 그럼 이 값을 인트로 변환할 수는 없는 건가? 할 수 가 없다. 에러가 뜬다.😭 우선 스트링은 heap 에 저장 된다. (WWDC에서 말한 내용이니 이것은 맞다.) 🚨여기서 부터 뇌피셜 주의 String.Index 의 공식 문서를 보면 이 타입이 인스턴스로 var hashValue: Int 를 가지고 있고 메서드로는 func hash(into: inout Hasher) 를 가지고 있다. 추측하기로는 String.Index은 뭔가 우리가 알수 없는 무슨 값을 가지고 있고 그걸 구현되어 있는 해쉬 함수에 넣어보니 어떤 Character..

    [swift] Substring는 왜 있는 걸까?

    🗒 Substring 이란? String 타입을 가지고 메서드로 변형을 하게 되면 이상하게 return 타입이 String 이 아니고 Substring 이다. 애플 공식문서가 말하길 Substring 타입은 String 타입과 거의 동일한 메서드를 가지고 있기 때문에 String처럼 사용할 수 있는 타입이라고 한다. @frozen struct Substring 🧐 Substring이 존재하는 이유 위의 말에 따르면 String이나 Substring이나 별 다를게 없다는 건데 그럼 왜? Substring 타입을 따로 만들었을까? (귀찮게...) 바로 성능 최적화 때문이라고 한다. Substring 타입은 String을 변환했을 때 생긴다. 그래서 저장 공간을 아끼기 위해서 변환하기 전의 String 타입의..

    [iOS] delegate 구현하기

    ✍🏻 delegate 패턴 이란? delegate 의 뜻은 위임이다. 나의 권한을 다른 사람에게 위임하다. 원래는 내가 사용하도록 가지고 있는 권한인데 다른 사람에게 내 권한을 사용할 수 있게 위임한다. 라는 의미로 사용 된다. delegate pattern 의 의미도 같다. 원래 나의 오브젝트가 처리할 권한을 가지고 있어서 처리해야 할 일을 다른 오브젝트에게 권한을 넘겨주어서 다른 오브젝트에서 처리하도록 해주는 패턴이다. ✍🏻 Delegate 패턴 예시 👧🏻 예시를 통해서 알아보자. 👨🏻‍💼 사장 클래스와 👩🏻‍💼직원 클래스가 있다. 회식을 하고 결제를 하는 일은 원래 사장님이 권한을 가지고 있는 일이다. 그런데 사장님이 이번 회식에는 참여를 못하게 되었다. 그래서 직원 한명에게 카드를 긁을 수 있는 ..

    [iOS] Notification Center 구현하기

    😁 노티피케이션 센터란? 노티피케이션 센터란, 등록된 관찰자에게 알려줄 수 있도록 하는 알림 메커니즘이다. KVO 나 delegate 가 1 대 1 통신을 하는 것에 가깝다면 노티피케이션 센터는 여러곳에서 온 정보를 한 곳에서 모아서 다시 여러 곳으로 뿌려주는 것에 가깝다. 그래서 많은 사람들이 방송국에 노티피케이션 센터를 비유한다. 💻 노티피케이션 센터 구현해보기 NotificationCenter 공식 문서 노티피케이션 센터라는 이미 만들어져 있는 클래스를 사용하면 된다. 노티피케이션 센터는 싱글톤으로 구현되어 있기 때문에 어디에서 불러와도 같은 객체를 불러오게 된다. 이 순서를 따라서 구현하면 된다. ✅ 노티피게이션 센터에서 값을 전달하기 (post) ✅ Observer 등록하기 ✅ Observer가..

    KVO 구현하기

    🗝 KVO란? KVO는 Key-Value observing 이다. 다른 오브젝트의 프로퍼티 속성이 변경되었을 때, 오브젝트에서 변경사항을 알 수 있게 해주는 것 이다. KVO는 NSObject 를 상속받은 클래스에서 사용할 수 있다. 오브젝트끼리의 응집력(끈끈하게 묶어줌)이 좋기 때문에, 항상 같이 다녀야 하고 코드의 재활용성이 떨어진다. 👊🏻 KVO 사용법 KVO 를 swift 코드에 적용해 보자. 📦 택배 클래스를 만들고, 택배의 배송정보가 업데이트 되면 자동으로 받아서 볼 수 있도록 하는 코드를 만들어 보자. 트랙킹할 클래스 지정 먼저 트랙킹할 (정보를 가져올) 클래스를 지정한다. 그 클래스를 아래와 같이 설정해 준다. class Shipping: NSObject { @objc dynamic var..