iOS

[스탠포드iOS] Swift 기초문법 정리(Optional, Tuple, Data Structure)

홍복치 2024. 3. 16. 16:47

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같은 근본적인 타입으로 사용