일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- iOS 13.0+
- 정규표현식
- xcodecloud
- Navigation
- network
- Alamofire
- Firebase
- UI
- swiftdata
- 앱구조
- SWIFT
- ObjC
- combine
- concurrency
- iOS 개발자
- framework
- TCA
- tuist #xcodecloud #ios #ci/cd #swiftlint #firebase
- IOS
- uikit
- Tuist
- xcode
- regex
- Git
- SWIFTUI
- navigationsplitview
- 개발
- composablearchitecture
- ios18
- github
- Today
- Total
목록분류 전체보기 (72)
iOS 개발 기록

앱을 개발하다가 밀린 커밋을 Github에 푸쉬하려는데 다음과 같은 에러가 떳다. Github에는 파일 용량이 50MB 이하이기를 권장한다. 따라서 해당 에러에서는 2가지를 확인할 수 있다. 1. 50MB 이상인 경우 Warning를 표시한다. 2. 100MB 이상인 경우 Error처리 후 원격 저장소에 푸쉬가 안된다. 확인해보니 CocoaPods를 통해 설치했던 Realm에 있는 시뮬레이터의 파일에서 용량을 초과한 것 같았다. 해당 파일을 삭제해도 문제가 될 것 같지는 않았다. 그런데 나중에 사용하는 파일이 용량을 초과할 경우 어떻게 해결할지 미리 공부할 겸 찾아보았다. 해당 문제에는 크게 git-lfs를 사용하는 방법과 BFG Repo-Cleaner를 사용하는 방법이 있었다. Git-LFS 1. 원..
Realm은 모바일 환경을 주요 타킷으로 하는 오픈소스 데이터베이스 관리 시스템이다. 모델 구조가 객체 컨테이너로 된 NoSQL 데이터베이스를 지향하며 조금 더 직관적인 사용이 가능하고 데이터 처리 속도가 향상된 장점이 있다. 찾아보니 SwiftUI와 Combine에도 적극적으로 지원하는데 정리된 자료가 많이 없는것 같아 개인적으로 공부하며 정리해본다. Realm 의 장점 1. Swift 뿐만 아니라 JAVA, Objective-C, JavaScript, React Native 등을 지원해 크로스 플랫폼으로 DB를 공유할 수 있다. 2. SQLite, FMDB, CoreDate 등 보다 빠르다. 3. Real-Time data base sync가 가능해 Realm Studio 으로 실시간으로 데이터를 확..

애니메이션은 그것이 발생하는 어떤 계기가 있기 전의 상태, 동작 중인 상태, 동작이 끝난 상태 3가지로 구분해서 생각할 수 있다. 즉, 시작과 끝 사이의 변화값이 있다는 것으로 중간값이 없는 Bool값으로는 애니메이션을 사용할 수 없다. animation 함수 struct Example: View { @State private var blur: Bool = false @State private var reduction: Bool = false var body: some View { Image("Life") .blur(radius: blur ? 10 : 0) .animation(nil)// 이전의 함수들에는 애니메이션을 적용하지 않고 .scaleEffect(reduction ? 0.2 : 1) .anima..

Reference : https://developer.apple.com/documentation/combine RX와 같은 비동기 이벤트를 처리하기 위한 프레임워크. iOS13부터 사용 가능하고, iOS13 이전 버전은 RX를 사용해야 한다. Publisher import Combine var IntArrayPublisher: Publishers.Sequence = [1,2,3].publisher RX의 Obsevable. 관찰 가능한 대상으로 데이터를 전달함. 전달할 때에 제네릭 형태로 으로 같이 보낸다. 에러 타입 중에 Never이 있는데, 얘는 어떠한 에러도 발생 안시킨다. Subscriber IntArrayPublisher.sink(receiveCompletion: { completion in s..

var body : some View { ... } [ 불투명 타입의 사용 이유 ] SwiftUI를 접하면서 이전에 못 본 some이라는 키워드가 눈에 띄었다. 여기서 some은 불투명 타입에 관련된 키워드로 프로퍼티나 함수 등의 반환 타입에 한정적으로 사용된다. 이때에 body가 가진 반환 타입은 반드시 some View여야 하는건 아닌데, some을 빼면 다음과 같은 오류가 발생한다. 첫번째는 프로토콜을 사용할 때에 타입을 유추할 수 없어서 발생하는 오류이고, 두번째는 타입 유추를 할 수 없기 때문에 뷰 프로토콜 조건이 만족되지 않아 발생하는 오류이다. 때문에 반환 타입을 정확하게 명시해주면 문제 없이 동작한다. 밑의 예에서 반환 값을 구조체 ProductRow라 명시하거나 Text로 명시하자 문제 ..
- 선언형 프로그래밍 : SwiftUI 는 기존의 명령형(Imperative) 대신 선언형(Declarative) 프로그래밍 방식이다. UI 구성을 단계적으로 만들어나가는 대신 최종적으로 어떤 모습이 되기를 원하는지 결과를 선언하는 형태를 뜻한다. 선언형 프로그래밍은 상태에 따라 바뀌게 되는 제어 흐름을 하나하나 관리해야 하며 이는 버그를 유발하기 쉽고 복잡성이 늘어나는 문제점이 있다. - 자동화 : 많은 기능이 자동으로 수행될 수 있도록 제공하는 것을 목표로함. - 조합 : SwiftUI의 API는 조합과 분리를 간단히 제공함. 예를 들어 큰 뷰를 하나의 기능을 가진 작은 뷰로 분리하거나 조합하는 것을 쉽게 만들 수 있음. - 일관성 : UI는 데이터와 항상 동기화되어 일관성 있게 보여야 한다는 것. ..

func solution(_ record:[String]) -> [String] { var nickname = [String : String]() var result = [String]() enum printScript: String { case Enter = "님이 들어왔습니다." case Leave = "님이 나갔습니다." } let recordAry = record.map{ $0 } // 닉네임 Dic 업데이트 recordAry.forEach{ let sen = $0.components(separatedBy: " ") if sen.count == 3 { nickname.updateValue(sen[2], forKey: sen[1]) } } // record 순서대로 메세지 출력 recordAry.f..

처음에 문제를 읽고 바로 파악하기 쉽지 않았고, 출력 예제를 보고나서야 어떤 문제인지 파악할 수 있었다. 주어지는 응답완료시간과 처리시간을 가지고 시작 시간을 구해야 한다. 주어지는 로그의 배열이 응답 완료 시간을 기준으로 정렬되어 있기 때문에 해당 로그의 시작 시간이 전의 로그의 끝나는 시간보다 빠르다면 작업 처리 요청이 무조건 겹친다고 볼 수 있다. 예를 들어 S4의 경우 S3보다 끝나는 시간이 늦지만 시작 시간이 (end + 1s) 이내이기 때문에 겹친다고 볼 수 있지만 S3는 시작 시간이 (end+1s) 보다 늦기 때문에 포함시킬 수 없다. import Foundation func solution(_ lines:[String]) -> Int { if lines.count == 1 { return ..

최단 경로 그래프 탐색 문제 처음에는 그래프 탐색 문제이길래 DFS로 풀어보려 했다. Code. 1 import Foundation let NM = readLine()?.components(separatedBy: " ").map{ Int(String($0))! } let n = NM![0] let m = NM![1] var maps = [[Int]]() var current = [0, 0] var result = m*m// 나올 수 있는 최대값 for i in 0..= 0 && next[1] = 0 else { continue } guard maps[next[1]][next[0]] == 1 else { continue } DFS(next, count+1, visited + [..

아이디어는 바로 떠올랐다. 앞에서부터 현재 수와 다음 수를 비교하여 작다면 현재 수를 제거하는 식으로 풀면 될 것 같았다. Code. 1 import Foundation func solution(_ number:String, _ k:Int) -> String { var numAry = number.map{ String($0) } let numCount = number.count - k var i = 0 while numAry.count != numCount { // 배열 끝까지 탐색하면 뒤에서부터 제거 if i >= numAry.count-1 { numAry.removeLast() } else if numAry[i] == "9" {// 해당 수가 9일 경우 다음으로 넘어감 i += 1 } else { i..