1. Optional
옵셔널은 모든 타입의 옵셔널이 될 수 있다
enum Optional<T> {
case None
case Some(T)
}
let x: String ?= nil
let x = Optional<String>.None
let x: String ? = "hello"
let x = Optional<String>.Some("hello")
switch x {
case Some(let value): y = value
case None:
}
옵셔널은 사슬처럼 연결될 수 있다(옵셔널 체이닝)
두 코드는 서로 같은 기능을 한다
옵셔널 체이닝이 되어있으면 앞에서부터 추출할 수 있는 값을 추출하고 추출할 수 없다면 전체표현에서 nil을 반환한다
그래서 x는 int일수도 optional일수도 있기 때문에 optional int 타입이 된다.
var display: UILabel?
if let label = display {
if let text = label.text {
let x = text.hashValue
}
}
if let x = display?.text?.hashValue { ... }
옵셔널의 기본값 지정
"??"을 사용해서 기본값을 지정할 수 있다.
위와 아래 코드는 동일 역할을 한다.
let s: String? = ...
if s != nil {
display.text = s
} else {
display.text = " "
}
display.text = s ?? " "
2. Tuple
서로 다른 타입을 묶어 하나의 그룹으로 만든다.
타입이 들어가는 자리(타입이 유효한 곳)에는 튜플을 만들 수 있다.
튜플을 꺼내오는 방법 2가지
1) 지역변수의 이름이 되는 id만들고 튜플x를 할당
2) 튜플 생성 시 id값을 만들기
let x: (String, Int, Double) = ("Hello", 5, 0.85)
let (word, number, value) = x
print(word) //Hello
print(number) //5
print(Double) //0.85
let x: (w: String, i: Int, v: Double) = ("Hello", 5, 0.85)
print(x.w)
print(x.i)
print(x.v)
튜플은 함수에서 여러가지 값을 반환 할 수 있는 장점이 있다.
func getSize() -> (weight: Double, height: Double) { return (250, 80) }
let x = getSize()
print(x.weight)
print(getSize().height)
3. Range
Range는 Array처럼 일반화된 타입
Int로 된 Range나 무언가의 인덱스로 된 Range도 될 수 있음
Int의 Range - Range<Int>
String의 Range는 Int 아님.
부분String이 필요할 때 Int로 된 Range 사용 불가하며 Range(String.Index) 사용 필요
struct Range<T> {
var startIndex: T
var endIndex: T
}
let array = ["a", "b", "c", "d"]
let subArray1 = array[2...3] //["c", "d"]
let subArray2 = array[2...<3] //["c"]
for i in 27...104 {}
4. Data Structures
class, Struct, Enum
class CalculatorBrain {
}
struct Vertex {
}
enum Op {
}
[공통점]
키워드 + 이름으로 같은 방식으로 선언된다.
모두 프로퍼티와 함수를 가질 수 있다.
하지만 enum은 저장 프로퍼티를 가질 수 없고 계산 프로퍼티만 가질 수 있음(enum의 케이스와 연관값이 enum의 저장소)
enum 제외 초기화 함수를 가질 수 있다.
[차이점]
상속(클래스만 가능하다)
Value type(struct, enum) vs Reference type(class)
Value type
- 함수에서 인자로 전달될 때 값이 복사, 다른 변수에 할당될 때도 값이 복사
- 값 타입은 let 변수에 할당한 경우 값을 바꿀 수 없음
- 함수의 인자는 상수. 구조체나 enum이 바뀔 수 있을 때 모든 함수에 바뀔 수 있다는 "mutating" 표시
Reference type
- 힙 영역에 저장되어 있다가 참조를 줌. 참조는 자동으로 카운팅
- 스위프트는 가비지컬렉션 미존재. 힙 메모리에 기록되고 치워짐
- 카운터 0이 되면(마지막으로 참조하던 포인터 영역 벗어남 등) 힙에서 즉시 사라짐
- GC는 뒤에서 무슨일이 일어나는지 보고 있다가 오랫동안 힙에 머무는 것들 수집
- 이 과정에 참여할 수 있는 유일한 방법이 weak와 strong
구조체 vs 클래스
- 대부분 구조체보다는 클래스를 더 사용
- 구조체는 String, Double, Dictionary같은 근본적인 타입으로 사용
'iOS' 카테고리의 다른 글
[스탠포드iOS] Swift 기초문법 정리(Method, Property) (0) | 2024.03.16 |
---|---|
RxSwift(2) - 연산 (0) | 2020.04.04 |
RxSwift(1) (0) | 2020.04.03 |
MVVM패턴 (0) | 2020.04.02 |