일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Xcode
- wwdc
- 머신러닝
- 알고리즘
- ReactiveX
- 독서
- 책 추천
- string
- 문자열
- ARC
- 딥러닝
- rxswift
- objc
- ios
- Animation
- 책
- SWIFT
- Algorithm
- objective-c
- Deep learning
- stanford SwiftUI
- RX
- 책 후기
- 스위프트UI
- swift5
- 스위프트
- leetcode
- swiftUI
- iOS SwiftUI
- 애니메이션
- Today
- Total
목록SWIFT (116)
THIS IS ELLIE
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 프레임워크를 포함해라. (마젠타 색으로 표시된 것은 키워드를 나타낸다...
스위프트에서 클래스는 레퍼런스 타입이고 구조체와 열거형은 값 타입입니다. 값 타입의 속성은 기본적으로 인스턴스 메서드 내에서 수정할 수 없습니다. 값 타입의 속성을 수정하려면 인스턴스 메서드에서 mutating 키워드를 사용해야 합니다. mutating을 붙이면 self 프로퍼티에 새로운 인스턴스를 할당할 수 있습니다. struct Point { var x = 0.0, y = 0.0 mutating func moveBy(x deltaX: Double, y deltaY: Double) { self = Point(x: x + deltaX, y: y + deltaY) } } mutating moveBy(x:y:)메소드는 x, y값이 타겟 위치로 설정된 새 구조체를 만듭니다. 또 다른 예제 enum TriSta..
어떤 분이 초기화되지 않은 버퍼에 액세스 할 수 있는 배열 초기화 프로그램을 만든 포스트를 보다가 작성하게 되었어요. forums.swift.org/t/array-initializer-with-access-to-uninitialized-buffer/13689 스위프트에서 배열 크기 늘리기 // Grwoing the size an array 스위프트에서 배열은 내용을 보관하기 위해 특정 사이즈만큼의 메모리를 예약해둡니다. 배열에 element를 추가하고 해당 배열이 예약된 용량을 초과하기 시작하면, 배열은 더 큰 메모리 영역을 할당하고 해당 element를 새 저장 공간에 복사합니다. 이때 새 저장소의 크기는 이전 저장소 크기의 배수입니다. 이렇게 배수로 증가시키는 것은 상수 시간으로 element가 추가..
값이 변하면 UI가 업데이트되어야 한다고 가정해봅시다. 그때 SwiftUI에서는 @State를 사용할 수 있습니다. SwiftUI는 State로 선언된 프로퍼티의 저장 공간을 관리합니다. SwiftUI에서 @State변수가 변경되면 뷰는 appearance를 무효화하고 body를 재계산합니다. 주어진 뷰에 대한 단일 소스로 사용합니다. State 인스턴스는 값 그 자체라는 것이 아니라 값의 읽기와 쓰는 수단입니다. 뷰의 본문 내부 또는 호출된 메서드에서만 프로퍼티에 접근해야 합니다. 뷰 클라이언트가 접근하지 못하도록 프로퍼티를 private으로 선언합니다. 어떤 스레드에서도 프로퍼티 상태를 변경하는 것은 안전합니다. 다른 뷰에 프로퍼티 상태를 전달하기 위해서 $와 변수 이름을 함께 사용해 프로퍼티 속성을..
2020/10/12 - [개발/iOS] - AVPlayer클래스 살펴보기 2020/10/12 - [개발/iOS] - AVPlayer에서 플레이어 상태 파악하기 AVPlayer는 미디어 재생과 타임을 관리할 수 있는 컨트롤러이다. 이번에 AVPlayer를 사용해 개발하다가 하루 종일 끙끙거린 문제가 있었다. 먼저 AVAsset으로 모델링한 것으로 AVPlayerItem을 만들어 플레이어에 넣어주었다. 그리고 플레이어를 재생시키면 잘 재생되는 것 까지 확인 완료. 문제는 여기다. 잘 재생되다가 오디오 인터럽트가 지속될시에 현재 재생하고 있는 미디어가 노출되지 않는 현상이 발생했다. (카메라 앱에서 동영상을 오래동안 찍고 있거나 슬립 상태에 진입) 애플에서 자체적으로 비디오 렌더링을 못하게 막는 것 같았음. ..