안녕하세요 오늘은 얼럿에 대해서 알아보겠습니다. 얼럿은 iOS15에서 업데이트되었기 때문에 iOS 15 이상만 지원하면 되는지? iOS 13,14도 지원해야하는지? 생각해보시고 상황에 따라 다르게 구현하면 됩니다. 먼저 iOS 15에서는요 modifier를 통해 얼럿을 생성할 수 있습니다. struct ContentView: View { @State private var showingAlert = false var body: some View { Button("얼럿 생성") { showingAlert = true } .alert("여기 타이틀", isPresented: $showingAlert) { Button("OK", role: .cancel) { print("OK 누름") } } } } 여기서 @S..
Property Wrappers @something은 다 프로퍼티 래퍼이다. 각 Property Wrapper는 구조체이며 이는 'template'동작을 캡슐화한다. 예를 들어 @State는 변수가 힙에 살도록 하고 @Published는 변경이 있을 때 publish 하도록 하고 @ObservedObject는 published 변경이 감지되면 뷰를 다시 그리도록 하고 Property Wrapper는 이 구조체들을 생성하고 사용하기 쉽게 해준다. Property Wrapper 안 쓰면 아래처럼 사용해야 한다. Property Wrapper를 사용하기 위해 구조체를 만들고 그에 맞게 구현해줘야 한다. 또한 Property Wrapper안에 또 다른 변수가 존재하는데 projectedValue이다. 이 pro..
Color vs UIColor - Color ShapeStyle에 Color를 사용할 수 있다. ex) .foregroundColor(Color.green) View에 Color를 사용할 수 있다. ex) Color.white 하지만 API는 제한적이다. - UIColor 시스템 관련 색상을 포함해 더 많은 색이 있다. 원하는 UIColor가 있으면 Color(uiColor:)를 사용하면 된다. Image vs UIImage - Image 주로 View역할을 한다. (jpeg또는 gif등)을 포함하는 타입의 변수는 아니다.(그건 UIImage의 역할) Asset에 있는 이미지는 Image(name: String)으로 접근할 수 있다. 시스템 이미지를 사용하기 위해서는 Image(systenName:)으로..
접근제어자 접근제어자는 접근에 대한 권한을 지정하는 것. 다른 곳에서 접근할 필요가 없으면 private키워드를 붙여준다. private(set) 키워드를 작성해 get만 가능하도록 할 수 있다. private(set) var cards: Array MemoryGame 모델에 cards변수에 private(set)을 지정해 뷰모델에서 접근만 가능하도록 한다. // MARK: - Access to the model var cards: Array { return model.cards } @ViewBuilder some View를 리턴하는 모든 곳에는 해당 키워드@ViewBuilder를 넣을 수 있다. Content는 뷰 리스트로 해석하고 하나로 결합한다. 여기서 하나의 뷰는 (2개에서 10개의 뷰) Tupl..
Array+Only 배열의 Element가 오직 한 개인지 확인하는 연산 프로퍼티 정의. 배열 Element개수가 1개면 first를 리턴하고 아니면 nil을 리턴. Array+Identifiable Array의 Element가 Identifiable을 준수할 때 firstIndex(matching: Element) -> Int? 함수를 사용해 원하는 인덱스를 가져올 수 있다. Grid Item, ItemView는 제네릭이 때문에 타입은 몰라도 되고 where을 통해 Identifiable, View라는 제약을 준다. init부분에 viewForItem은 초기화 할 때 사용하지 않고 나중에 사용되기 때문에 @escaping을 붙혀줌. 이는 레퍼런스 타입이며 힙에 존재한다. 모델 mutating func ..
모델 모델 MemoryGame은 에 들어오는 타입이 무엇인지 상관하지 않는다. (제네릭 사용) MemoryGame을 init 하면서 CardContent가 무엇인지 신경 쓰는 쪽이 모델을 위해 만들어준다. 아래 mutating func choose(card: Card)함수를 살펴보자. mutating func choose(card: Card) { print("card가 선택되었다 \(card)") let chosenIndex: Int = index(of: card) cards[chosenIndex].isFaceUp = !cards[chosenIndex].isFaceUp } 여기서 파라미터로 넘어오는 card는 let이기 때문에 상수이다. 우리는 in-place하게 array에 있는 카드의 속성을 변경하기..
SwiftUI에서 스택은 3가지 종류가 있습니다. 3가지 종류는 VStack, HStack, ZStack입니다. VStack 먼저 VStack을 살펴보겠습니다. 공식 문서를 살펴보면 VStack은 Gneric Structure이며, 자식들을 수직으로 배열하는 뷰입니다. ContentView의 body에 VStack을 추가하겠습니다. VStack에는 Text가 두 개 들어가 있습니다. Hello, World1 그리고 Hello World2가 수직으로 나열됩니다. HStack 다음은 HStack을 살펴보겠습니다. 공식 문서를 살펴보면 HStack은 Gneric Structure이며, 자식들을 수평으로 배열하는 뷰입니다. ContentView의 body에 HStack을 추가하겠습니다. HStack에는 Text..
- Total
- Today
- Yesterday
- 머신러닝
- 애니메이션
- ios
- 문자열
- 스위프트UI
- ARC
- 독서
- leetcode
- 스위프트
- Algorithm
- string
- iOS SwiftUI
- 책 후기
- 책 추천
- Xcode
- Deep learning
- 책
- 딥러닝
- objective-c
- Animation
- stanford SwiftUI
- 알고리즘
- swift5
- swiftUI
- wwdc
- objc
- SWIFT
- rxswift
- RX
- ReactiveX
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |