MVC(Model, View, Controller) 패턴
Model
- 어플리케이션이 무엇을 말하는지를 말한다.
- 계산기 앱에서는 계산을 하는 부분
Controller
- 모델이 스크린에 어떻게 표현될 것인지를 말한다.
- 기본적으로 모든 컨트롤러에 들어가는 UI 로직
View
- 컨트롤러의 하위 종속자
- 컨트롤러가 화면에 무언가를 보여주기 위해 사용
MVC 사이의 관계
- Controller
- 컨트롤러는 모델의 모든 것을 알고 있고 보내고 싶은 요청을 언제든지 보낼 수 있다.
- 컨트롤러는 사용자에게 모델에 있는 것을 표현하거나 사용자로부터 정보 받아 모델을 업데이트 하는 것이기 때문에
전체적인 통제가 필요하다. - View의 경우도 마찬가지이다.
- 대부분의 뷰와 모델의 연결은 outlet을 통해서 이루어진다.
- Model
- 모델과 뷰는 서로 소통하지 않는다.
- 모델은 UI와는 독립적이기 때문에 UI에 의존하는 뷰와는 소통할 이유가 없기 때문
- 뷰와 모델간의 소통은 컨트롤러를 통해 이루어진다.
- 모델을 컨트롤러에게 직접적으로 말할 수 없다.
- 컨트롤러는 UI로직을 다루고, 모델은 UI와는 별개이기 때문
- 모델과 뷰는 서로 소통하지 않는다.
- View
- 뷰와 컨트롤러간의 소통은 제한적이다.
- 뷰는 컨트롤러에 대해 하위종속적이기 때문에 UI에서 일어나는 모든 일들을 컨트롤러에게 말해야 한다.
- 뷰와 컨트롤러 사이의 의사소통은 눈에 보이지 않고 구조화 되어야 한다.
- 일반적으로 control + 드래그를 통한 타겟 액션이 있다.
- 뷰는 자신이 보여주고 있는 데이터를 소유할 수 없다.
Class와 struct의 차이
- struct(구조체)는 enum처럼 값으로 전달된다.
- 값으로 전달한다는 의미는 전달할 때 복사한다는 의미이다.
- Array, Int, Double, String 모두 struct이다.
- 예를 들어 Array를 다른 메소드로 전달한 다음 그 Array에 무언가를 추가하더라도 호출하는 쪽의 Array에는 아무 변화가 없다.
- 클래스는 참조형식으로 전달된다.
- 참조형식의 경우 heap영역에 저장되었다가 전달하게 되면 값 그 자체가 아닌 메모리의 주소를 전달하게 된다.
Tuple(튜플)
- 스위프트의 타입 중 하나로 서로 다른 타입들을 그룹으로 묶어서 하나의 타입으로 만들어 타입이 들어갈 자리라면 튜플을
어디서든지 사용 가능하다. - 튜플을 사용할 때 외부 매개변수를 사용하여 호출할 수도 있다.
예시
let x: (String, Int, Double) = ("Hello", 10, 0.5)
let (word, number, value) = x
print(word) //Hello
print(number) //10
print(value) //0.5
//외부 매개변수 사용
let x: (w: String, i: Int, v: Double) = ("Hello", 10, 0.5)
print(x.w)
print(x.i)
print(x.v)
Range
- 범위는 무엇이든지 연속될 수 있는 것의 양 끝점을 가르킨다.
- ... 이나 ..< 기호를 사용하여 표현한다.
- 배열에도 사용 가능하고 일반 숫자에도 사용 가능하다.
예시
let array = ["a", "b", "c", "d"]
let subArray1 = array[2...3] //c, d
let subArray2 = array[2..<3] //c
for i in 1...10 { }
Data Structures(데이터 구조)
Class, Struct, Enum의 특징
공통점
- 키워드 + 이름 + { } 구조로 비슷한 방법으로 선언이 된다.
- 모두 프로퍼티와 함수를 가질 수 있다.
차이점
- 클래스와 구조체와 달리 enum은 저장 프로퍼티를 가질 수 없다.
- enum을 제외한 클래스와 구조체는 초기화 함수가 필요하다.
- 클래스만 상속이 가능하다.
Class와 struct의 차이
- struct(구조체)는 enum처럼 값으로 전달된다.
- 값으로 전달한다는 의미는 전달할 때 복사한다는 의미이다.
- Array, Int, Double, String 모두 struct이다.
- 예를 들어 Array를 다른 메소드로 전달한 다음 그 Array에 무언가를 추가하더라도 호출하는 쪽의 Array에는 아무 변화가 없다.
- 클래스는 참조형식으로 전달된다.
- 참조형식의 경우 heap영역에 저장되었다가 전달하게 되면 값 그 자체가 아닌 메모리의 주소를 전달하게 된다.
Array(배열)
- 배열의 정식 표현은 var a = Array<String>() 이지만 약식 표현인 var a = [String]()을 많이 쓴다.
- 배열의 객체를 생성할 때 스위프트 자체의 타입 추론 때문에 자료형을 안써줘도 된다.
예시
let animals = ["Giraff", "Cow", "Dog", "Cat"]
//배열 나열하는 법
for animal in animals {
print("\(animal)")
}
Array Methods
filter
- 배열에서 조건에 맞는 값을 찾아서 true인 값만 반환시킨다.
let bigNumbers = [2,40,50,11].filter({$0 > 20}) //20보다 큰 숫자
print(bigNumbers) //40,50
map
- Array안에 있는 각 요소들을 다른 것으로 바꾼다.
//Int로 되어있는 배열을 String으로 바꾼다.
let stringified: [String] = [1,2,3].mpa{String($0)}
reduce
- Array의 결과를 하나로 줄인다.
//배열 안의 수를 다 더한다.
let sum = [1,2,3].reduce(0) { $0 + $1 }
print(sum)
Dictionary
- Array와 비슷하지게 key-value로 이루어져 있고 [ ]를 더 많이 사용한다
var exDictionary = [String:Int]() //String이 key, Int가 Value
exDictionary = ["Stanford":1, "Cal":10]
let ranking = exDictionary["Ohio State"]
print(ranking) //nil
let rank = exDictionary["Stanford"]
print(rank!) //1
//Dictionary 나열하는 법
for (key,value) in exDictionary {
print("\(key) = \(value)")
}
Other Classes
NSObject
- 모든 Objective-C 클래스들의 기본 클래스
NSNumber
- Objective-C에서의 구조체는 스위프트의 구조체와 같지 않고 C의 구조체와 유사하다.
Array와 Dictionary는 클래스이고, Double과 Int는 C의 double, int와 같다. - Array안에 숫자를 넣으러면 Array는 객체로 되어 있고, double과 int는 C 원시타입이기 때문에 넣지 못한다.
이 때 사용하는 것이 NSNumber이다. NSNumber는 원시타입을 객체 안에 포장하기 위한 방법인 것이다.
NSDate
- 날짜는 온 지구상에서 다른 방법으로 표현되기 때문에 UI에 날짜를 넣으려면 주의해야 한다.
- Date 클래스는 이 방법들을 다 알고 있고, NSCalender, NSDateFormatter, NSDateComponents같은
날짜를 넣을 때 도움이 되는 형제 클래스들이 있다.
NSData
- 현재 날짜와 시간을 알려준다.
AnyObject
- 타입중 하나로 모르는 클래스의 객체에 대한 포인터 주소를 뜻한다.
- 클래스에 대한 객체에만 사용하고 구조체에는 사용하지 않는다.
- 어떤 객체가 많은 타입이 될 수 있어서 무슨 타입인지 모를 때 AnyObject로 타입을 지정해 준다.
- AnyObject를 사용하면 우리가 아는 타입으로 변환을 해주어야 하는데 변환하려고 할 때 그 타입이 아닐수도 있기 때문에
as 키워드를 사용하여 시도를 한다. 그렇기 때문에 반환 타입은 옵셔널이다.
Property List
- AnyObject를 사용하는 또 다른 곳이다.
- 기본적으로 Array, Dictionary, String, Double, Int, NSData, NSDate의 조합으로 되어 있다.
이 클래스들로 데이터 구조를 만들면 Porperty List가 생긴 것이고 표현하기 위한 단어이다.
'iOS-Study' 카테고리의 다른 글
iOS Study : 12주차 - 얼굴앱 만들기 (0) | 2023.01.24 |
---|---|
iOS Study : 11주차 - 계산기 클론 코딩 (0) | 2023.01.19 |
iOS Study : 10주차 - 오토레이아웃 정리(2) (0) | 2023.01.09 |
iOS Study : 9주차 - 오토레이아웃 정리(1) (0) | 2022.12.28 |
iOS Study : 8주차 - MVVM 디자인 패턴 (0) | 2022.12.26 |