일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- base64 변환
- SwiftUI
- development language
- scrolling tab
- url 관찰
- Side Menu
- url 추적
- Swift Package Manager
- 개발자 면접
- 상단 탭바
- transformation.map
- 스크롤 탭
- notifychanged
- DevelopmentRegion
- pod install
- detect url
- List
- Android
- swift
- oberve url
- convert base64
- swift #swift keychain #keychain 사용법
- UIViewControllerTransitioningDelegate
- 기존 앱
- Tuist
- DataBinding
- GeometryReader
- ios
- ViewBuilder
- UIPresentationController
- Today
- Total
목록Swift (22)
버그 잡이
onReceive - Publisher가 발행될때 이를 탐지할 수 있는 함수 예제 코드 struct ContentView: View { @State private var message: String = "" var body: some View { VStack { Text(message) } .onReceive(timer) { _ in message = "Timer fired" } } let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect() } onChange - 특정 값이 변경되었을때 이를 탐지할 수 있는 함수 - iOS 14부터 사용 가능 - Equatable을 준수하는 값이면 탐지 가능 - oldValue 캡처 가능 예제 코드..
이번에 현업 레거시 프로젝트에 Tuist를 적용해보았는데요. 그 삽질기를 남겨보겠습니다. (아직 Tuist에 대한 이해가 많이 부족하니 틀린 부분이 있다면 댓글로 남겨주시면 감사하겠습니다!) Tuist 적용법 1. Cocoapod 제거 먼저 기존 프로젝트는 Cocoapod으로 라이브러리를 연동했었습니다. Tuist를 쓰면서 SPM을 활용할 것이기 때문에 프로젝트 내에서 CocoaPod 제거하는 작업을 먼저 진행해줍니다. pod deintegrate pod cache clean --all + Podfile, .workspace 파일 지우기 2. Tuist 설치 및 Project.swift 파일 생성 아래 스크립트로 tuist를 설치해주고 curl -Ls https://install.tuist.io | ba..
TCA 란? - '일관적이고 이해할 수 있는 방법으로 앱을 개발할 수 있게 도와주는 라이브러리' - composition, testing, ergonomics(인체 공학)를 염두해두고 만들었다고 합니다. * 구조 1. 사용자의 동작은 View를 통해 Action의 형태로 변환됩니다. 2. Action은 Reducer에서 처리되어 State를 바꿉니다. 3. State를 구독하고 있는 View는 State의 변화에 따라 최신화됩니다. 4. Environment는 외부 의존성이라고 생각하면 됩니다. Environment를 Effect로 변환해서 Action을 실행시킵니다. * Effect - Composable 외부에서 일어난 일을 가져와서 상태를 변경시킬때 사용 - 외부 접근 = API , Disk, Ti..
아래 영상을 보고 학습한 내용을 정리한 글임을 밝힙니다. https://www.youtube.com/watch?v=Msv0D5zwmHQ import Foundation final class ListNode { // ListNode는 본인의 값(value)와 다음 값의 포인터(next)를 가지고 있는 객체이다. let value: Int var next: ListNode? init(value: Int) { self.value = value } } func createLinkedList() -> ListNode { // 1. value만 있는 node Array를 생성해주고 let nodes: [ListNode] = Array(1...10).map { ListNode(value: $0) } // 2. hea..
가끔 base64 형식의 이미지를 받아서 UIImage로 변환 후 사용할 때가 있습니다. 이때 사용하면 좋은 extension을 소개합니다. extension UIImage { public var base64: String { return self.jpegData(compressionQuality: 1.0)!.base64EncodedString() } convenience init?(base64: String, withPrefix: Bool) { var finalData: Data? if withPrefix { guard let url = URL(string: base64) else { return nil } finalData = try? Data(contentsOf: url) } else { final..
이번에 웹앱을 만들었습니다. 네이티브에서는 웹뷰로 url 을 띄워주는 기능만 있습니다. 화면이 present 되고 탭이 선택되는 등의 액션은 모두 웹에서 url 이동을 통해서 이루어집니다. 그런데, 요구사항으로 특정 url에서는 swipe로 navigation 되는 기능을 빼달라는 요청이 들어왔습니다. 이를 위해서는 웹뷰 내에서 url 이동을 트랙킹 할 수 있어야 합니다. 해결 방법 1. webView의 URL 을 관찰할 수 있는 observer를 추가합니다 self.webView.addObserver(self, forKeyPath: "URL", options: .new, context: nil) 2. obserValue 메서드를 오버라이드 해서 url을 받아봅니다. override func observ..
이번 WWDC21에서 async / await 이 공식적으로 소개되었습니다. swift 5.5 그리고 iOS 15부터 사용가능하지만 정식으로 소개된 만큼 이제는 알아볼 필요가 있을 것 같습니다. async, await async, await 은 "비동기 코드를 동기적으로 작성하게 해주는 swift extension" 입니다. (말이 좀 어려운데, 기존에 비동기 코드를 작성할 경우 지저분해지는 코드를 이쁘게 만들어주는 역할을 합니다.) 말로는 이해가 어려우니 기존에 어떤 문제가 있었고 async, await은 어떤 장점이 있는지 코드로 한번 살펴보겠습니다. 기존 문제 // 1. 서버에서 기온 데이터를 받아온다 func fetchWeatherHistory(completion: @escaping ([Doubl..
위와 같이 버튼가 이미지 사이에 간격을 주는 방법에 대해서 정리해보겠습니다. (정말 간단한 부분인데 항상 까먹네요..) 코드로 짜기(programmatically) imageButton.titleEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: -10) imageButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 10) size inspector 활용 참고로 inspector로 할 경우 -10 와 같은 음수는 타이핑으로 입력이 안 되는 오류가 종종 있는데 (xcode 문제인듯..) 이때는 옆에 있는 위/아래 버튼을 활용해서 입력하면 됩니다.