본문 바로가기

iOS/Swift5

[Swift/Xcode] 하나의 빌드 설정에 여러 xconfig을 등록하는 방법 카카오 로그인을 구현하는 와중에 Native App Key, API key 등을 숨기고 싶어secret 키들을 담고 있는 xcconfig 를 따로 만들어 깃에 업로드되지 않도록 관리하고 싶었다. 문제는 debug, release 빌드 설정에 이미 CocoaPod에서 생성한 xcconfig 파일이 등록된 상태이 상황에서 두 xcconfig 을 하나의 빌드 설정에 모두 적용하고 싶었다.  #include#include 지시자를 사용하면 하나의 xcconfig 파일에서 다른 xcconfig 파일의 내용을 포함할 수 있다.#include "Pods/Target Support Files/Pods-walkbook/Pods-walkbook.debug.xcconfig"KAKAO_API_KEY = "APIKEY"  주의.. 2024. 7. 27.
[Swift] 이미지 크기 Resize 방법 세 가지 1. UIGraphicsBeginImageContextWithOptionsextension UIImage { func resize(targetSize: CGSize) -> UIImage? { let size = self.size let widthRatio = targetSize.width / size.width let heightRatio = targetSize.height / size.height let newSize = CGSize(width: size.width * min(widthRatio, heightRatio), height: size.height * min(widthRatio, hei.. 2024. 7. 20.
[Swift] Coordinator 패턴으로 화면 전환 +DIContainer(Swinject) 1. Coordinator 패턴의 목적구현 방식을 이야기하기 전에 Coordinator 패턴이 고안된 이유를 살펴보면ViewController(혹은 ViewModel)에서 화면 전환 로직을 포함한 다양한 로직들을 담게 되는 상황에서비대해진 ViewController 혹은 ViewModel에서 화면 전환 로직을 분리하자는 목적으로 고안되었다고 한다. 기존의 일반적인 방식대로면 ViewController 내부에서 직접 어떤 화면으로 어떻게 화면을 전환할 것인지 로직을 작성했다.하지만 이를 Coordinator라는 클래스에 따로 작성하여 ViewController 프로퍼티로 이 객체를 전달하여 화면 전환에 필요한 메서드만 호출하여 사용한다.이런 방식은 ViewController에서 다음 화면이 어떤 ViewC.. 2024. 7. 13.
[Swift] Dictionary(grouping:by:) https://developer.apple.com/documentation/swift/dictionary/init(grouping:by:) init(grouping:by:) | Apple Developer DocumentationCreates a new dictionary whose keys are the groupings returned by the given closure and whose values are arrays of the elements that returned each key.developer.apple.com 낯선 방식의 생성자이어서 기록해본다. let students = ["Kofi", "Abena", "Efua", "Kweku", "Akosua"]let studentsByLette.. 2024. 7. 12.
[Swift] KeyPath 이해하기 객체 속성에 접근할 때 타입 안전하게 접근하는 방법 : KeyPathSwift4에서 도입객체의 특정 속성에 대한 경로를 표현하는데 사용됨KeyPath를 통해 객체의 속성에 접근하면 컴파일 타임에 타입 체크가 이루어지기 때문에 안전한 코드 작성 가능KVO(Key-Value Observing)과 함께 사용되는 케이스가 있음struct Person { var name: String var age: Int}let nameKeyPath = \Person.namelet ageKeyPath = \Person.agelet person = Person(name: "John", age: 30)print(person[keyPath: nameKeyPath]) // "John"print(person[keyPath: .. 2024. 7. 11.