WidgetKit (4)
이제 조금 더 확장을 해보려고한다.
RepoMediumView 만들기
또 새로운 파일을 하나 만들어준다.
이때 이전에 언급하지는 않았지만
target을 항상 신경써서 만들자
이전에 NetworkManager의 경우 혹시 원 프로젝트 파일에서도 사용이 될 가능성이 있어서 둘다 체크를 했지만, 지금 View의 경우는 Widget에서만 사용 하므로, 굳이 할피룡가 없어 target을 하나만 한다.
혹시라도 하나만 체크하고 target을 추가하려면 해당 파일로가서
이렇게 추가를 해주도록 하자.
그리고 widgetkit을 import해주는데 이렇게 되면
프리뷰에서 위와 같은 에러가 발생한다.
아...
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:...
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...
WidgetKit (1)
SwiftUI를 공부하기전 파이널프로젝트를 하고 난뒤, 다른 조들의 프로젝트 결과를 보면서 하나 이건 해보고 싶다고 생각했던것이 바로 Widget 사용이었다.
하지만 전제조건은 SwiftUI를 사용해야한다는 것이었다.
그러다보니 그당시엔 UIKit에만 집중을해서 신경을 쓸수가 없었는데 마침 좋은 강의가 있어 그걸 기반으로 정리를 해보려 한다.
Widget관련 Apple 글은 여기서
Interface Guide line 은 여기.
Widget 만들기
프로젝트를 하나 만들고 나서
보통 일반적으로 우리가 View 이런걸 만들때는 File From template을 했는데 여기선 Target으로 한다.
...
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 {
...
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: {
...
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...
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(...
631 post articles, 79 pages.