일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 청년취업사관학교후기
- flutter
- 오늘의 색상
- ImageSlider
- CS193p
- 스위프트
- colorofdays
- WidgetTree
- collectionView
- 프로젝트회고
- 백준
- GIT
- 스터디
- UIKit
- MVVM
- Masil
- UserDefault
- 프로그래머스
- xcode
- SwiftUI
- stanford
- process
- 새싹후기
- xml
- flutter #state # stateful #stateless
- IOS
- 알고리즘
- Swift
- 조건문
- 코딩테스트
Archives
- Today
- Total
개발을 시작하는 이야기
[SwiftUI] Lecture 3: MVVM and the Swift type system 본문
강의 보기 : Youtube :: Stanford
각각의 디자인 패턴에 대한 설명은 일전에 작성해둔 글의 링크로 대체한다.
Struct와 Class
Struct | Class |
Value type | Reference type |
Copied when passed or assigned | Passed around via pointers |
Copy on write | Automatically reference counted |
Functionak programming | Object-oriented programming |
No inheritance | Inheritance (single) |
"Free" init initializes All vars | "Free" init initalizes No vars |
Multability must be explicitly stated | Always mutable |
Your "go to" data structure | Used in specific circumstances |
Everything you've seen so far is a struct (except View which is a protocol) |
The ViewModel in MVVM is always a class (also, UIK (old style iOS) is class-based) |
Generics
제네릭이란 타입에 의존하지 않는 범용 코드를 작성할 때 사용한다.
제네릭을 사용하면 중복을 피하고, 코드를 유연하게 작성할 수 있다.
Swift에서 가장 강력한 기능 중 하나로 Swift 표준 라이브러리의 대다수는 제네릭으로 선언되어 있다고 한다.
꺾새(<>)를 이용해서 안에 타입처럼 사용할 이름을 선언해주면 해당 이름을 타입처럼 사용할 수 있다. 여기서 선언한 이름을 Type Parameters라고 하는데, 새로운 형식이 생성되는 것이 아닌, 실제 함수가 호출될 때 해당 매개변수 타입으로 대체되는 Placeholder라고 볼 수 있다.
기존의 프로젝트에서 Model과 ViewModel을 분리시켜주었다.
Model
import Foundation
struct MemoryGame<CardContent> {
private(set) var cards: Array<Card>
func choose(_ card: Card) {
}
init(numberOfPairsOfCards: Int, createCardContent: (Int) -> CardContent) {
cards = Array<Card>()
// add numberOfPairsOfCards x 2 cards to cards array
for pairIndex in 0..<numberOfPairsOfCards {
let content: CardContent = createCardContent(pairIndex)
cards.append(Card(content: content))
cards.append(Card(content: content))
}
}
struct Card {
var isFaceUp: Bool = false
var isMatched: Bool = false
var content: CardContent
}
}
ViewModel
import SwiftUI
class EmojiMemoryGame {
static let emojis = ["💡", "📋", "🖥", "😺", "🗺", "😱", "🙈", "🤔", "📪", "👨🏫", "📱", "🎉", "📄", "💁", "📞", "👨💻", "⚒", "🙋", "🤵♂️", "😀", "😃", "😄", "😁"]
static func createMemoryGame() -> MemoryGame<String> {
MemoryGame<String>(numberOfPairsOfCards: 4) { pairIndex in
emojis[pairIndex]
}
}
private var model: MemoryGame<String> = createMemoryGame()
var cards: Array<MemoryGame<String>.Card> {
return model.cards
}
}
static
Type Property를 사용하기 위해 저장, 연산 프로퍼티 앞에 'static'을 붙여서 사용한다. (class 키워드도 사용하긴 한다) 저장 타입 프로퍼티의 경우 선언할 당시 원하는 값으로 항상 초기화가 되어 있어야 한다. 'static'을 이용해 선언하며, 자동으로 lazy로 작동한다. (lazy를 직접 붙일 필요 또한 없다.)
'개발 이야기 > Swift' 카테고리의 다른 글
[SwiftUI] Lecture 5: Properties Layout @ViewBuilder (0) | 2022.04.14 |
---|---|
[SwiftUI] Lecture 4: Memorize Game Logic (0) | 2022.04.14 |
[SwiftUI] Lecture 2: Learning more about SwiftUI (0) | 2022.04.10 |
[SwiftUI] Lecture 1: Getting started with SwiftUI (0) | 2022.04.08 |
UIKit (0) | 2022.04.05 |