iOS
-
Swift를 사용해서 Cordova Custom Plugin 만들기 (1)iOS 2023. 5. 25. 03:13
Cordova 프로젝트에서 iOS 플랫폼의 메서드를 호출하고, 문자열을 수신하여 출력하기 위해서 간단한 Cordova Custom Plugin을 만들어보겠습니다. 플러그인 컴포넌트를 만들어내기 위해서, plugman을 설치해야 합니다. plugman은 플러그인 생성과 구성 및 관리를 도와주는 command line tool입니다. $ npm install -g plugman Create plugin using plugman $ plugman create --name CordovaSamplePluginSwift --plugin_id com.yeolmok.samplepluginswift --plugin_version 0.0.1 create 메서드는 플러그인의 뼈대를 만들어주는 메서드입니다. plugin.xm..
-
Swift Package에 GitHub Actions 사용하기iOS 2023. 5. 5. 16:08
GitHub Actions는 빌드, 테스트, 배포 파이프라인을 자동화할 수 있는 CI/CD(continuous integration & continuous delivery) 플랫폼입니다. 이 글의 아래에서는 GitHub Actions를 사용해서 간단한 Swift Package에 CI를 적용해보려고 합니다. 쉽게 말해서, 깃허브 저장소에 새로운 내용을 push 할 때, 트리거 되어 실행되는 스크립트를 작성해보겠습니다. GitHub Actions의 컴포넌트로는 다음과 같은 것들이 있습니다. Workflow Event Job Action Runner Workflows Workflow는 하나 이상의 job으로 구성되어 그것들을 수행하는 자동화 프로세스입니다. YAML 파일(형식: *.yml)에 정의되어 이벤트가..
-
Class와 Performance in SwiftiOS 2023. 2. 2. 14:16
Reducing Dynamic Dispatch Swift는 기본적으로 Objective-C처럼 동적인(dynamic) 언어입니다. 하지만 Objective-C와 달리 Swift에서는 프로그래머가 필요에 따라 dynamism을 제거하거나 줄여서 런타임 성능을 향상시킬 수 있습니다. Dynamic Dispatch 클래스는 프로퍼티와 메서드에 접근하기 위해 기본적으로 동적 디스패치를 사용합니다. 따라서 아래와 같은 코드에서 동적 디스패치를 통해 a.aProperty, a.doSomething(), 그리고 a.doSomethingElse()에 접근합니다. class A { var aProperty: [Int] func doSomething() { ... } dynamic doSomethingEles() { ....
-
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..