유클리드 호제법이란? 드디어 알고리즘을 공부하다가 처음 마주한 녀석이다. 두 양의 정수 최대공약수를 구하는 방법으로 유클리드 알고리즘이 있다. 아래의 설명이 가장 이해하기 쉬운것 같아서 가져왔다. Swift로 구현하기 최대공약수를 영어로 하면 Greatest Common Divisor 이기 때문에 보통 GCD 라 한다. 결과값이 나올때까지 자기자신을 계속 사용하는 재귀함수를 구현하여 구할 수 있다. a > b 일 경우 a = bq + r 이기 때문에 r 을 a % b 로 구할 수 있어 반복이 가능하다. 만약 여기서 a < b 일 경우에도 b 가 0 이 되지 않기 때문에 결국 a < b 일 경우 gcd(a, b) = gcd(b, a) 로 결국 가기 때문에 고려할 필요가 없다. func gcd(_ a: In..
분류 전체보기
TabView 를 만들다가 이상한(?) 현상을 발견했다. TabView 를 생성하고, 두번째 페이지부터 시작하게 되면 selection 을 첫번재 페이지로 가게 바꿔줘도 Tab 이 변경되지 않는다! 이게 무슨 말이냐 하면... 이상한 현상 아래와 같은 화면을 만드는 아주 간단한 코드를 만들었다고 해보자. 상단은 페이지를 표시해주고 아래 버튼을 누르면 해당 페이지로 이동하는 코드이다. import SwiftUI struct ContentView: View { @State private var selection = 1 var body: some View { VStack { Text("Page: \(selection)") ZStack { Color(.systemGray3) TabView(selection: $..
User Notification앱을 사용하다보면 아래와 같은 알림을 많이 찾아볼 수 있다. 이것을 앱에서 간단하게 어떻게 구현할 수 있을까? User Notifications | Apple Developer DocumentationPush user-facing notifications to the user’s device from a server, or generate them locally from your app.developer.apple.com Notification 권한 요청하기우선 Notification 을 사용하려면 권한 요청이 필요하다. NotificationCenter 라는 파일을 만들어주고, 권한을 요청할 것이다. NotificationCenter 클래스를 만들어주고, import U..
앱의 시작시점에 무언가를 해주기 위해서라면 아래의 init() 에 포함시켜 주면 된다. 하지만 앱이 종료되는 시점에 무언가를 해야 하거나 앱의 디테일한 상태 시점에 따라서 무언가를 해줘야 할 때는 어떻게 할까? import SwiftUI @main struct SampleApp: App { init() { print("app start") } var body: some Scene { WindowGroup { ContentView() } } } AppDelegate, SceneDelegate 갑자기 SwiftUI 에서 무슨 Delegate 냐 하는데... 알아두면 유용한 친구들이다... 후에 구조체나 클래스가 자신의 일부 책임을 다른 타입의 인스턴스에게 위임하는 Delegate 패턴에 대해서 알아보도록 하..
ScenePhase? 앱을 만들다보면 앱이 잠깐 백그라운드로 갔을때나 백그라운드에서 다시 돌아왔을때, 시점이 필요할때가 있다. 나같은 경우는 잠깐 앱을 background 상태로 두고 권한을 변경한다면? 이 것을 UI 에 바로 적용시킬 수 없을까? 하는 궁금증에서 찾아보았는데 방법이 있었다! 바로 ScenePhase 를 활용하면 된다. 공식문서에 정말 친절하게 사용설명이 되어있다. ScenePhase | Apple Developer Documentation An indication of a scene’s operational state. developer.apple.com ScenePhase 사용해보기 사용방법은 아주 간단하다. 아래와 같이 @Environment 로 변수를 선언해주고, scenePhas..
네트워크 연결 확인 뷰 아래와 같이 네트워크 연결에 따라서 실시간으로 인터넷 연결, 인터넷 연결 안됨 창을 표시한다. NetworkMonitor 클래스 생성 아래와 같이 SwiftUI 에 새로 도입된 @Observable 이 사용된다. init() 을 하게 되면, isConnected 라는 변수를 인터넷의 연결여부에 따라서 업데이트 해준다. import Foundation import Network @Observable class NetworkMonitor { private let networkMonitor = NWPathMonitor() private let workerQueue = DispatchQueue(label: "Monitor") var isConnected = false init() { ne..
Swift 를 사용하면서 본인도 모르게 self. 를 많이 사용했을 것이다. self 는 말그대로 나 자신! 이라는 뜻을 가지고 있다. 그렇다면 [weak self] 는 무엇일까? 실습을 통해 아주 간단하게 맛보기만 보려고 한다.약한참조간단하게 ARC 에 대해서 설명해 보자면, Swift에서는 ARC(Automatic Reference Counting, 자동 참조 카운팅)를 사용하여 객체의 메모리를 관리한다. 이 참조를 약한 참조(weak)로 만들면 참조 카운트가 증가하지 않는다. ARC 에 의해서 참조 카운팅이 0 이 되었을때 메모리에서 해제가 되는데 강한 참조가 걸려있으면 카운팅이 0 이 되기전까지 해제되지 않는다. 예시코드기본 구조아래같이 Navigate 버튼을 누르면 다음뷰로 가고 다음뷰는 He..
swift 를 활용하면서 좀 아쉬운 부분이 달력 아니던가?! 달력을 구현할 수 있지만 아주 간단하고 깔끔하게 달력을 만드는 방법이 iOS 16.0 버전 이후로 UICalendarView 를 지원한다. 😀 내가 만드는 프로젝트에도 달력이 들어가기 때문에 간단하게 활용해보면 좋겠다고 생각하여 UICalendarView 를 사용해보기로 했다. UICalendarView | Apple Developer Documentation A view that displays a calendar with date-specific decorations, and provides for user selection of a single date or multiple dates. developer.apple.com UICalenda..