- [ SwiftUI ][Property Wrapper]@State, @Biniding, @Observable, @Bindable2025-06-14 23:17:24UIKit을 다루다 SwiftUI를 공부하면 처음보는 여러 Property Wrapper를 마주하게 된다.그 중 오늘 공부한 Property Wrapper들을 정리하려고 한다. 우선 두 개념을 설명하기 앞서, SwiftUI에서는 기존 View가 class기반에서 struct기반으로 변경되었다.이유는 SwiftUI 선언형 UI로 상태에 따라 뷰를 새롭게 그려주기 때문이다. 이때 class(참조 타입)는 기존 인스턴스를 유지하는 방면, struct(값 타입)은 새롭게 인스턴스를 생성하며 view를 그려주기 때문에 view가 안정적이다. 안정적인 이유는 생성된 인스턴스가 여러곳에서 참조되고 있다면 상태의 변경을 추적하기 어렵다.class A { var x = 0}let a = A()let b = ab.x..
- [ UIKit ]view에 gradient 적용하기2025-05-29 14:00:29보통 UIView를 그대로 사용하기 보단 RootView나 BaseView라는 커스텀 클래스로 만들어 필요한 기능들을 넣어놓고 사용하는 경우가 많다.그 중 Gradient를 적용해두면 언제든 해당 뷰에 그라디언트 효과를 적용할 수 있기 때문에 편리하다.Gradient 구현Gradient를 구현에 있어서 필요한 것은 CAGradientLayer다. https://developer.apple.com/documentation/quartzcore/cagradientlayer CAGradientLayer | Apple Developer DocumentationA layer that draws a color gradient over its background color, filling the shape of the..
- [ TroubleShooting ]isSecureTextEntry 활성화로 인하여 발생하는 입력값 초기화2025-02-10 16:02:14개요textField의 isSecureTextEntry를 활성화해주면 비밀번호와 같이 숨김 처리를 해야하는 정보들이 알아서 가림 처리가 된다.그래서 보통 비밀번호 TextField는 위 프로퍼티를 꼭 활성화시켜주곤 한다. 다만 isSecureTextEntry를 활성화하면, TextField가 resigned된 이 후 다시 response가 발생했을 때 자동으로 입력값을 초기화시켜버린다. 위 영상처럼 해당 텍스트 필드를 벗어난 후 다시 입력할 때 다시금 입력해야하는 불편함이 발생했다.그리고 이게 그렇게 자연스럽게 느껴지지 않는다. 해결 방법솔직히 간단하게 끝날 줄 알았는데, 생각보다 오래걸렸다.private var isEditingDidEnd: Bool = falselet passwordStream = p..
- [ TroubleShooting ][TS] CollectionView.rx.itemSelected가 먹통이 된 이유2025-02-09 11:27:32개요특정 상황에서 CollectionView.rx.itemSelected가 동작하지 않는다.원인커스터마이징한 RootView와 RootViewController를 상속받아 사용하는데, 여기서 나는 해당 뷰에 대한 터치 이벤트를 항상 추가해주기 위해서 view에 tapGesture를 설정했다.이를 상속받은 하위 Custom View와 ViewController에서 tapGesture에 대한 이벤트를 어떻게 처리할지만 정하면 되기 때문에 편리하다.문제는 tapGesture에 cancelsTouchesInView라는 프로퍼티가 존재한다.기본 값은 true이고, 제스처가 인식되면 보류되었던 다른 터치 이벤트들은 전달되지 않고 touchesCancelled 메서드로 메시지가 전달된다고 한다.즉 설정한 tapGes..
- [ Swift ][Swift] Clean Architecture2025-02-09 11:25:57Clean Architecture란소프트웨어(Software)란 제품이 출시되면 변경이 어려운 유형의 하드웨어(Hardware)와 다르게 유연한 변경과 확장이 가능하다.그러나 시스템 아키텍처를 고려하지 않고 만든 소프트웨어는 유연한 변경과 확장이 어렵고 이는 무형임에도 하드웨어와 다를바가 없어진다고 생각한다.이를 위해 나온것이 클린 아키텍처이며(즉, 유연한 변경과 확장이 가능하도록 설계하는 것), 클린 아키텍처는 소프트웨어를 계층으로 분리하여 시스템 구성요소들의 독립성을 강화하고 의존성을 약화하여 그 자체로 언제든 테스트 용이하게 만든다.이는 앞서 말한 소프트웨어의 유연한 변경과 확장을 가능캐한다.계층Swift에서 클린 아키텍처를 적용하면 보통 3가지 레이어로 구분한다.아래에서 말하는 컴포넌트는 각 계층..
- [ Swift ][Swift] Copy On Write2025-02-09 11:20:49Swift에서는 COW 방식이 적용되어있다.Copy On Write는 값 복사가 이루어질 때는 실제 복사가 아닌 값의 메모리주소를 참조하고 있다.그 이후 값 변경이 이루어질 때 실질적인 값 복사가 이루어지진다.그래서 값타입은 값복사가 이루어진다는 말은 반은 맞고, 반은 틀리다.실제로는 복사 후 변경이 있을 때 실질적인 복사가 이루어져 새로운 메모리를 할당하고, 값이 변경된다.
- [ Swift ][Swift] final 키워드와 Dispatch를 통한 성능 향상2025-02-09 11:18:53클래스의 override를 제한하거나 서브클래스가 더 이상 존재하지 않을 때 final 키워드를 사용한다.final을 통해 상속이 더 이상 필요없음을 명시할 수 있을 뿐더러, 런타임 성능이 향상된다.성능 향상은 왜 있을까?swift에는 어떤 메소드를 호출할 것인지를 결정하여 실행하는 메커니즘인 Dispatch라는 개념이 존재한다이 Dispatch는 다시 Static Dispatch와 Dynamic Dispatch로 구분된다.Static Dispatch컴파일 시점에 호출될 함수를 결정하여, 런타임 시 그대로 실행시킨다.이는 컴파일 시점에 이미 결정이 되기 때문에 성능 상 이점이 있다.Dynamic Dispatch런타임 시점에 호출될 함수를 결정하여, 실행시킨다.함수 호출 과정에서 vtable을 통해 간접호..
- [ Swift ][Swift] GCD 요약2025-02-09 11:16:06동시성 프로그래밍여러 작업을 동시에 실행Swift에는 이러한 동시성 프로그래밍을 가능캐 해주는 2가지 기능이 있다.Dispatch QueueOperation QueueGCD(Grand Central Dispatch)Dispatch Queue는 FIFO Queue형태로 작업을 순서대로 전달받는다.Serial / ConcurrentSerial이전 작업이 끝나면 다음 작업을 시작하는 직렬 형태아무런 설정을 하지 않으면 Serial로 동작Concurrent추가된 작업을 동시에 처리Sync / AsyncSync큐에 추가된 작업이 완료될때까지 기다림Async큐에 추가된 작업의 완료를 신경쓰지 않음Main / GlobalMainMain Thread가 해당 작업을 맡음Default는 Serial로 동작하나 Concur..