iOS
-
UIButton 커스텀(Image & Title)iOS 2023. 2. 1. 20:08
lazy var okButton: UIButton = { let button = UIButton(type: .custom) button.translatesAutoresizingMaskIntoConstraints = false button.layer.cornerRadius = 8 button.backgroundColor = .systemGreen button.setTitle("OK", for: .normal) // Title button.titleLabel?.font = .systemFont(ofSize: 20) button.setImage(UIImage(systemName: "checkmark.circle"), for: .normal) // Image button.addTarget(self, action..
-
UIKit에서 SwiftUI View 활용하기iOS 2023. 1. 2. 01:46
UIKit에서 SwiftUI View를 활용하기 위해서는 UIHostingController를 사용하면 됩니다. UIHostingController SwiftUI View 계층 구조를 포함하고 있는 UIViewController 따라서, UIHostingController는 UIKit view controller의 모든 API를 활용할 수 있음. UIKit에서 UIViewController를 사용하고 있는 곳에서 전부 사용 가능. Modal, Navigation 모두 UIViewController 처리하는 것처럼 하면 됨. 굉장히 간단함. UIKit에 SwiftUI View를 아래의 방식으로 어떻게 포함시킬 수 있는지 간단한 예시들로 알아보겠습니다. Modal Navigation Embed 포함시킬 Sw..
-
Actor in Swift concurrencyiOS 2022. 12. 31. 07:39
Actor는 Swift concurrency의 핵심으로, async/await 및 structured concurrency와 함께 작동하여 정확하고 효율적인 동시성 프로그래밍 구축을 돕습니다. 데이터 경합(Data Race)은 두 개의 별도의 스레드가 동일한 데이터에 동시에 접근하고 이러한 접근 중 적어도 하나가 '쓰기' 작업일 때 발생합니다. 데이터 경합이 발생할 수 있다고 판단되면, actor를 사용해서 low-level에서 데이터 경합을 방지할 수 있습니다. 데이터 경합은 공유되는 가변 상태로 인해 발생합니다. struct는 동시에 접근할 수 있는 코드가 있을 때 컴파일하는 것을 허용하지 않으며, 값 타입이므로 따로 변수에 복사해서 할당한 후 작업을 수행하면 데이터 경합은 발생하지 않지만, 그것은 ..
-
Diffable DataSourceiOS 2022. 12. 29. 04:53
Diffable DataSource는 간단하고 효율적으로 UICollectionView, UITableView의 데이터 및 UI에 대한 업데이트를 관리할 수 있게 해줍니다. 둘 다 동일한 방식으로 적용하면 되며, 이 글에서는 테이블 뷰를 예로 들겠습니다. 구식 방식에서는 UITableViewDataSource 프로토콜의 구현 메서드에서 editingStyle을 다음과 같이 사용하면서, 아이템을 삭제할 때 애니메이션을 적용할 수 있었습니다.extension CitiesViewController: UITableViewDataSource { func tableView(...) { ... } func tableView(_ tableView: UITableView, commit editingStyle:..
-
Localization in iOSiOS 2022. 12. 14. 04:06
아래 세 가지로 나눠서 현지화에 대해 알아보겠습니다. 기기의 언어 및 지역 정보를 가져와서 소스 코드 내에서 사용하여 사용자 맞춤 데이터를 제공 앱 이름을 언어에 따라 변환하여 현지화를 수행 UI 컴포넌트의 문자열을 변환하여 현지화를 수행 기기 Locale 정보 가져와서 사용하기 기기의 언어 및 지역 정보는 Locale 타입을 이용해서 가져올 수 있습니다. Locale은 사용자에게 보여주기 위한 데이터의 형식을 지정하는 데 사용하기 위한 언어, 문화 및 기술 규칙에 대한 정보를 가지고 있습니다. 다음과 같이 설정 > 일반 > 언어 및 지역의 값을 확인할 수 있습니다. func printLocale() { let identifier = Locale.current.identifier let regionCod..
-
Operator, Combine Framework in SwiftiOS 2022. 12. 11. 17:00
Combine 프레임워크는 앱이 이벤트를 처리하는 방법에 대한 선언적 접근 방식을 제공합니다. 지정된 이벤트 소스에 대해 단일 처리 체인, 즉 파이프라인을 만들 수 있습니다. 파이프라인은 데이터 처리 단계의 출력이 다음 단계의 입력으로 이어지는 형태로 연결된 구조로, 이렇게 연결된 데이터 처리 단계는 한 여러 단계가 서로 동시에, 또는 병렬적으로 수행될 수 있어 효율성이 향상됩니다. 이러한 각 부분은 이전 단계에서 받은 요소에 대해 고유한 작업을 수행하는 Operator입니다. 예를 들어, Combine으로 구독할 수 있는 Notification을 생성했을 때, Notification을 받은 후 operator를 사용하여 이벤트 전달 내용을 사용자 정의하고 최종 결과를 사용하여 UI를 업데이트할 수 있습..
-
Publisher와 Subscriber, Combine Framework in SwiftiOS 2022. 12. 9. 01:48
Combine은 시간 경과에 따라 값을 처리하기 위한 프레임워크입니다. 이벤트 처리 코드를 중앙 집중화하고 Networking, Key-Value Observing, Notification 및 Callback과 같은 비동기적인 데이터의 흐름을 단순화하여 가독성이 좋아지고, 유지보수하기가 쉬워집니다. Combine Features Generic Combine은 swift로 작성되었습니다. 따라서 Generic과 같은 swift 기능을 활용할 수 있습니다. Type safe type safe하기 때문에, 런타임이 아닌 컴파일 시점에 오류를 포착할 수 있습니다. Composition first 핵심 개념(Publisher, Subscriber, Operator)은 간단하고 이해하기 쉬우며, 부분적인 기능들이 ..
-
Async/await in SwiftiOS 2022. 12. 3. 17:56
비동기 프로그래밍은 복잡해서 잘못된 비동기 코드를 작성하기 쉽습니다. 클로저가 중첩될수록 구조가 더욱 복잡해지며 이에 따라 에러 처리가 어려워지고, 실수로 결과 처리 블록을 빼먹을 수도 있습니다. 하지만 async/await로 이를 해결할 수 있을 뿐만이 아니라 코드도 간결해집니다. 기존에 completion handler로서 escaping closure를 매개변수로 받아 사용하던 것을, async/await 패턴을 사용하면 코드를 더 쉽게 읽고 이해할 수 있습니다. 이는 비동기 코드를 일반 코드처럼 작성할 수 있기 때문입니다. 따라서 코드를 작성하면서 혼란을 겪지 않으며, 의도를 더욱 정확하게 전달할 수 있습니다. 제가 기존의 방식으로 작성했던 코드에 async/await를 적용하면서 어떻게 변하는지..