본문 바로가기

SWiFT9

[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.
[RxSwift] AsyncSubject AsyncSubject는 Observable이 emit한 마지막 값만 emit 하며 Observable이 complete된 후에만 emit 된다. 즉, onCompleted 를 기다렸다가 마지막에 emit 받은 값만 emit 한다.import RxSwiftlet disposeBag = DisposeBag()let asyncSubject1 = AsyncSubject()asyncSubject1.subscribe( onNext: { value in print("Value: \(value)") }, onError: { error in print("Error: \(error)") }, onCompleted: { print("Completed") .. 2024. 7. 26.
[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.
[UIKit] UITableView didSelectRowAt 메서드 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { print("hi") } 테이블 뷰의 셀을 클릭해도 select 이벤트를 관리하는 위 메서드가 호출되지 않는다.. 일단 아래처럼 Outlet 연결은 되어 있다. class FlightListViewController : UIViewController, UITableViewDataSource, UITableViewDelegate { @IBOutlet weak var tableView: UITableView!​ 그리고 Delegate, DataSource 연결도 해놨다. override func viewDidLoad() { super.viewDidLoad() tabl.. 2024. 4. 9.
[Swift] 백준 16139 : 인간-컴퓨터 상호작용 https://www.acmicpc.net/problem/16139 16139번: 인간-컴퓨터 상호작용 첫 줄에 문자열 $S$가 주어진다. 문자열의 길이는 $200,000$자 이하이며 알파벳 소문자로만 구성되었다. 두 번째 줄에는 질문의 수 $q$가 주어지며, 문제의 수는 $1\leq q\leq 200,000$을 만족한다. 세 번째 www.acmicpc.net 풀이 과정 누저합 원리만 알고 있다면 크게 어려움이 없는 문제이다. 단, 1) 질문의 수가 최대 200,000번이기 때문에 매번 반복되지 않도록 한번 누적합을 구한 알파벳의 누적합은 저장해놓고 사용하도록 하고 2) 물어보지 않을 특정 문자가 있을 수 있기 때문에 특정 문자가 등장하는지에 대한 누적합을 처음 물어볼 때에만 누적합을 구하도록 한다. 먼.. 2023. 12. 18.
[Swift] 백준 3020 : 개똥벌레 https://www.acmicpc.net/problem/3020 3020번: 개똥벌레 개똥벌레 한 마리가 장애물(석순과 종유석)로 가득찬 동굴에 들어갔다. 동굴의 길이는 N미터이고, 높이는 H미터이다. (N은 짝수) 첫 번째 장애물은 항상 석순이고, 그 다음에는 종유석과 석순이 www.acmicpc.net 풀이 방식 나는 처음에는 1...n 구간마다 장애물로 막혀 있는 곳의 위치들을 높이별로 빈도수 배열을 구한 뒤 배열 전체를 검색하면서 최솟값과 그 개수를 구하는 방식으로 구현했었다. // 완전 탐색으로 구현할 경우 O(n^2) 복잡도 for i in 0.. 2023. 12. 14.
[Swift] 백준 2559 : 수열 # 풀이 전형적인 누적합 문제. 아래와 같이 psum[0] = 0 부터 시작하는 prefix sum을 먼저 구한 뒤 var psum = [Int](repeating: 0, count: n + 1) for i in 1...n { psum[i] = psum[i-1] + inputArr[i-1] } psum[m] - psum[0] 부터 psum[n] - psum[n-m] 중 가장 작은 값을 찾는다. var max = Int.min; for i in m...n { if( max < psum[i] - psum[i-m] ) { max = psum[i] - psum[i-m] } } 소스코드 import Foundation let input = readLine()!.split(separator: " ").map{Int.. 2023. 12. 7.