본문 바로가기
iOS/Swift

Swift-2. 반복문, 옵셔널/옵셔널체이닝/옵셔널바인딩

by 헤콩 2023. 2. 24.
반응형

** edwith - Swift 프로그래밍 입문 강의 참고 **

 

 

# 반복문 #

for - in 구문

// for-in 구문 기본 형태
for item in items {
    /* 실행 구문 */
}
// 예시

var number = [1, 2, 3]
let people = ["yagom": 10, "eric": 15, "mike": 12]

for num in number {
    print(num)
}

for (name, age) in people {
    print("\(name): \(age)")
}

 

repeat - while 구문

// repeat-while 구문 기본 형태
repeat {
    /* 실행 구문 */
} while /* 조건 */
// 예시

repeat {
    number.removeLast()
} while number.count > 0

 

 

# 옵셔널 #

- 값이 있을 수도, 없을 수도 있음을 표현

- nil이 할당 될 수 있는지 없는지 표현

 

?? 옵셔널을 쓰는 이유 ??

명시적 표현 안전한 사용
1. nil의 가능성을 코드만으로 표현 가능
2. 문서/주석 작성 시간 절약
1. 전달받은 값이 옵셔널이 아니라면 nil 체크를 하지 않고 사용가능
2. 예외 상황을 최소화 하는 안전한 코딩
3. 효율적 코딩

 

옵셔널 문법과 선언

// 옵셔널 문법 : enum + general
// 옵셔널 선언
enum Optional<Wrapped>: ExpressibleByNiliteral {
    case none
    case some(Wrapped)
}

let optionalValue: Optional<Int> = nil
let optionalValue: Int? = nil

 

! 를 이용한 암시적 추출 옵셔널 - nil 할당 가능

// Implicitly Unwrapped Optional
var iuoValue: Int! = 100

switch iuoValue {
    case .none:
    	print("This Optional variable is nil.")
    case .some(let value):
    	print("Value is \(value).")
}

// nil 할당 가능
iuoValue = nil

? 를 이용한 옵셔널 - nil 할당 가능

// Optional
var optValue: Int? = 100

switch optValue {
    case .none:
    	print("This Optional variable is nil.")
    case .some(let value):
    	print("Value is \(value).")
}

// nil 할당 가능
optValue = nil

! ? 의 차이

var someValue: Int? = nil



var value: Int = someValue    // Int와 Int?는 엄연히 타입이 다르기 때문에 오류발생

var value: Int = someValue!
// !를 통해 "강제로" someValue의 값을 추출하기 때문에 컴파일러에서는 오류가 뜨지 않아요.
// 하지만 런타임 오류가 발생합니다.

 

# 옵셔널 추출 #

- 옵셔널에 들어있는 값을 사용하기 위해 꺼내오는 것

옵셔널 바인딩
1. nil 체크 + 안전한 추출
2. 옵셔널 안에 값이 들어있는지 확인하고, 값이 있으면 값을 꺼내옵니다.
3. if-let 방식 사용
func printName(_ name: String) {
    print(name)
}

var myName: String? = nil

// 이때 printName(myName)을 하게 되면, 전달되는 type이 다르기 때문에 오류!!
// 그래서 이렇게 nil인지 검사하고 추출해야 함
if let name: String = myName {
    printName(name)
} else {
    print("myName is nil.")
}
var yourName: String! = nil

if let name: String = yourName {
    printName(name)
} else {
    print("yourName is nil.")
}
// 이때 name상수는 if-let 구문 내에서만 사용 가능
myName = "been"
yourName = nil

if let name = myName, let friend = yourName {
    print("\(name) and \(friend)")
}
// yourName이 nil이기 때문에 실행되지 않음.
// ,를 사용한 여러 옵셔널을 바인딩 하는 것은 모든 옵셔널에 값이 있을 때만 동작

yourName = "hye"

if let name = myName, let friend = yourName {
    print("\(name) and \(friend)")
}
// been and hye

 

강제 추출 (unwrapping)

/* 옵셔널에 값이 들어있는지 아닌지 확인하지 않고 강제로 값을 꺼내는 방식 */
/* 만약 값이 없을 경우(nil), 런타임 오류 발생 */

var myName: String? = been
var yourName: String! = nil

printName(myName!) // been

myName = nil
printName(myName!) // 런타임 오류

yourName = nil
printName(yourName) // 런타임 오류

 

# 옵셔널 체이닝 (Optional Chaining) #

- 여러 객체를 혼합해서 사용 할 때, 옵셔널끼리 연산이 필요한 경우가 있습니다. 이 때, 객체마다 옵셔널 바인딩을 사용하면 복잡한 if문이 나오게 됩니다. 이 때, Optional Chaining을 사용하면 더 간단하게 처리할 수 있습니다.

class X {
    var y: Y?
}

class Y {
    var z: String?
}


var x: X = X()
if x.y?.z {
    /* x.y?.z를 통해 y의 옵셔널, z의 옵셔널 바인딩을 모두 처리합니다. */
}

 

반응형

'iOS > Swift' 카테고리의 다른 글

Swift-4. 클로저, 프로퍼티  (0) 2023.02.24
Swift-3. 구조체, 열거형  (0) 2023.02.24
Swift-1. 변수, 리스트, 함수  (0) 2023.02.24
[Swift 5.5] Async / Await  (0) 2021.12.20
Swift 접근 제어자 (Access Control)  (0) 2021.05.07

댓글