Home

WidgetKit (4)

이제 조금 더 확장을 해보려고한다. RepoMediumView 만들기 또 새로운 파일을 하나 만들어준다. 이때 이전에 언급하지는 않았지만 target을 항상 신경써서 만들자 이전에 NetworkManager의 경우 혹시 원 프로젝트 파일에서도 사용이 될 가능성이 있어서 둘다 체크를 했지만, 지금 View의 경우는 Widget에서만 사용 하므로, 굳이 할피룡가 없어 target을 하나만 한다. 혹시라도 하나만 체크하고 target을 추가하려면 해당 파일로가서 이렇게 추가를 해주도록 하자. 그리고 widgetkit을 import해주는데 이렇게 되면 프리뷰에서 위와 같은 에러가 발생한다. 아...

Read more

WidgetKit (3)

UI Design 이부분은 생략 다만 한가지 특이점이라면 HStack { StatLabel(value: 999, systemImageName: "star.fill") StatLabel(value: 99, systemImageName: "tuningfork") StatLabel(value: 999, systemImageName: "exclamationmark.triangle.fill") } fileprivate struct StatLabel: View { let value: Int let systemImageName: String var body:...

Read more

WidgetKit (2)

Dynamic Month 적용 Config 먼저 파일을 만드는데 일반 Swift File로 만든다. 이때 중요한점 target을 어떤것에 적용할지 반드시 확인하자. struct MonthConfig { let backgroundColor: Color let emojiText: String let weekdayTextColor: Color let dayTextColor: Color static func determineConfig(from date: Date) -> MonthConfig { let monthInt = Calendar.cu...

Read more

WidgetKit (1)

SwiftUI를 공부하기전 파이널프로젝트를 하고 난뒤, 다른 조들의 프로젝트 결과를 보면서 하나 이건 해보고 싶다고 생각했던것이 바로 Widget 사용이었다. 하지만 전제조건은 SwiftUI를 사용해야한다는 것이었다. 그러다보니 그당시엔 UIKit에만 집중을해서 신경을 쓸수가 없었는데 마침 좋은 강의가 있어 그걸 기반으로 정리를 해보려 한다. Widget관련 Apple 글은 여기서 Interface Guide line 은 여기. Widget 만들기 프로젝트를 하나 만들고 나서 보통 일반적으로 우리가 View 이런걸 만들때는 File From template을 했는데 여기선 Target으로 한다. ...

Read more

Async/Await (Fin)

마지막 글이되겠다. 5시간 강의였는데 하나하나 정리하면서 넘어가다보니 꽤나 많은 시간이 걸렸다. MainActor MainActor란? MainActor는 UI 업데이트와 관련된 코드를 안전하게 실행하기 위해 사용되는 Swift의 동시성 모델이다. 이를 사용하면 UI 상태 변경이 항상 메인 스레드에서 이루어지도록 보장한다. 우선 // VM func populateTodos() { do { guard let url = URL(string: "https://jsonplaceholder.typicode.com/todos") else { ...

Read more

Async/Await (12)

시나리오: 간단한 숫자 증가 앱 class Counter { var value = 0 func increment() -> Int { value += 1 return value } } struct ContentView: View { var body: some View { Button { let counter = Counter() print(counter.increment()) print(counter.increment()) } label: { ...

Read more

Async/Await (11)

Bank Account Playground 만들기 class BankAccount { var balance: Double init(balance: Double) { self.balance = balance } func withdraw(_ amount: Double) { if balance >= amount { let processingTime = UInt32.random(in: 0...3) print("[Withdraw] Processing f...

Read more

Async/Await (10)

Async Sequence를 지원하는 API URL FileHandle URLSession NotificationCenter 또한 우리가 알고있는 고차함수 map, compactMap, filter, first, prefix, zip 등을 활용할 수 있다. WWDC 1. FileHandle URL은 직전에 했기에 FileHandle을 사용해본다. 우선 File을 사용하기 위해 경로 설정을 해줘야한다. let paths = Bundle.main.paths(forResourcesOfType: "txt", inDirectory: nil) let fileHandle = FileHandle(...

Read more