@State 뷰 안에서 완전히 로컬라이즈 된 것. 얼럿 띄우기, 편집, 애니메이션과 같은 일시적인 상태에만 사용한다. View 구조체는 (read - only) 읽기 전용이다. 예로 SwiftUI가 모든 뷰를 유지하는 데 사용하는 변수는 let! 이다. let이면 immutable 하기 때문에 아무도 변경할 수 없으니까 어지럽힐 수도 없다. 또한 뷰 생성 시 초기화되는 변수 외에는 변수가 있는 것이 소용이 없다. 읽기 전용이거나 계산된 변수만 의미가 있다. 뷰는 대부분 "stateless"이어야 하며 모델을 그리는 역할을 한다. 그래서 대부분 뷰는 어떤 상태가 필요하지 않기 때문에 읽기 전용이다. 영구적인 상태는 모델에 속하고 일시적인 상태를 사용할 때 State를 사용한다. @State private ..
접근제어자 접근제어자는 접근에 대한 권한을 지정하는 것. 다른 곳에서 접근할 필요가 없으면 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..
알고리즘 문제를 풀다가 좋은 솔루션을 배우게 되어 포스팅하려 합니다. 오늘은 포스팅할 문제는 189번이고 난이도는 중간 난이도입니다. 문제를 살펴봅시다. 배열이 주어지면 배열을 오른쪽으로 k 단계씩 회전합니다. 여기서 k는 음수가 아닙니다. - 가능한 많은 해결책을 찾아보세요. 이 문제를 해결하는 방법은 적어도 3가지 존재합니다. - 너는 인플레이스로 공간 복잡도 O(1)로 처리할 수 있니 제약은 아래와 같습니다. 예제를 살펴보겠습니다. 아래 코드는 제가 처음 풀었던 방식입니다. func rotate(_ nums: inout [Int], _ k: Int) { for _ in 0.. 0 && k > 0 else { return } let k = k % nums.count guard k != 0 else {..
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에 있는 카드의 속성을 변경하기..
MVVM은 디자인 패러다임이다. MVVM 없이는 SwiftUI를 사용할 수 없다. 모델 앱의 백앤드 역할 그리고 UI와 View에 독립적이다. 그렇기 때문에 아래와 같이 SwiftUI패키지를 추가하지 않는다. import SwiftUI 데이터와 로직을 가진다. 예를 들어 카드 매칭 게임이 있으면 카드는 데이터가 되고 매칭 하는 부분은 로직이 된다. 뷰 모델을 반영한다. 상태를 가지지 않고 가질 필요가 없다. 리액티브 하기 때문에 모델이 변경될 때 뷰가 자동적으로 변경된다. 뷰모델 뷰를 모델에 바인드 한다. (바인딩) 번역가와 같다. // 모델에서 뷰로 만약에 모델 구조체에 변경이 있다면 뷰모델한테 변경이 있음을 알려준다. 뷰는 뷰모델을 관찰하고 있다가 자동적으로 뷰를 그린다. (즉 뷰모델은 뷰에 대한 포..
프로젝트를 처음 생성하고 ContentView의 모습이다. 아래 코드는 코드를 작성하는 부분과 화면이 프리뷰 윈도우가 나타나는 오른쪽을 연결해주는 역할을 한다. struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } } 개발을 하다보면 오른쪽 프리뷰 윈도우에 실시간적으로 반영이 안 될 때도 있지만, 그럴 때마다 우측 상단에 있는 resume버튼을 눌러주자. 그러면 프리뷰 윈도우에 노출될 것이다. import SwiftUI 위 줄은 SwiftUI 패키지를 포함한다는 뜻이다. UI작업이 포함되지 않는다면 Foundation 프레임워크를 포함해라. (마젠타 색으로 표시된 것은 키워드를 나타낸다...
Adopting Picture in Picture in a Custom Player 커스텀 플레이어에 PiP 적용하기 개요 커스텀 플레이어 UI에 컨트롤을 추가해 PIP 재생을 호출합니다. 살펴보기 AVKit프레임워크의 AVPictureInPictureController클래스를 사용해 커스텀 플레이어에 PIP 재생을 추가하세요. 이 클래스는 AVPlayerViewController에서의 PiP동작과 동일하게 커스텀 플레이어에서 구현할 수 있도록 해줍니다. 커스텀 플레이어 UI 업데이트하기 커스텀 플레이어에 UI를 추가하여 유저가 PiP를 재생할 수 있게 해야 합니다. 이 UI는 AVPlayerViewController에 의해 뜨는 시스템 기본 UI와 일관되어야 합니다. PiP 재생을 컨트롤하기 위한 표준..
- Total
- Today
- Yesterday
- leetcode
- ARC
- swift5
- 책
- ios
- ReactiveX
- string
- objective-c
- Algorithm
- 딥러닝
- 책 후기
- 스위프트UI
- iOS SwiftUI
- 독서
- SWIFT
- 책 추천
- stanford SwiftUI
- 알고리즘
- 애니메이션
- RX
- 문자열
- 스위프트
- objc
- swiftUI
- 머신러닝
- rxswift
- Xcode
- wwdc
- Deep learning
- Animation
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |