본문 바로가기

# 02/Swift

[Swift] 옵셔널

반응형

Optional


값이 '있을 수도 있고, 없을 수도 있음'





let optionalConstant: Int? = nil


// 다음은 에러

let someConstant: Int = nil



// nil 의 가능성을 명시적으로 표현


func someFunction(someOptionalParam: Int?) {

// . . .

}


func someFunction(someParam: Int) {

// . . .

}







Optional(enum + general)


enum Optional<Wrapped> : ExpressibleByNilLiteral {

case none

case some(Wrapped)

}


// Optional<Int> 를 간단하게 Int? 로 표현 하는 것

let optionalValue: Optional<Int> = nil

let optionalValue: Int? = nil








// !

// 암시적 추출 옵셔널 (Implicitly Unwrapped Optional)


var optionalValue: Int! = 100



// 옵셔널은 이넘 타입이기 때문에 값이 있는지 없는지 case 문으로 체크 가능 


switch optionalValue {

case .none:

print("This Optional variable is nil")

case .some(let value):

print("Value is \(value)")

}



// 기존 변수처럼 사용 가능

optionalValue = optionalValue + 1


// nil 할당 가능

optionalValue = nil



// 잘못된 접근으로 인한 런타임 오류 발생

optionalValue = optionalValue + 1








// ? 

// Optional


var optionalValue: Int? = 100


switch optionalValue {

case .none:

print("This Optional variable is nil")

case .some(let value):

print("Value is \(value)")

}


// nil 할당 가능

optionalValue = nil



// 기존 변수처럼 사용불가 - 옵셔널과 일반 값은 다른 타입이므로 연산 불가

optionalValue = optionalValue + 1







Optional Unwrapping


- Optional Binding - 옵셔널 바인딩

- Force Unwrapping - 강제 추출






Optional Binding

- 옵셔널의 값을 꺼내오는 방법 중 하나 nill 체크 + 안전한 값 추출



func printName(_ name: String) {

print(name)

}


var myName: String? = nil



printName(myName)

// 전달되는 값의 타입이 다르기 때문에 컴파일 오류 발생



if - let


func printName(_ name: String) {

print(name)

}


var myName: String! = nil


if let name: String = myName {

printName(name)

} else {

print("myName == nil")

}



// name 상수는 if-let 구문 내에서만 사용가능합니다.

// 상수 사용범위를 벗어났기 떄문에 컴파일 오류 발

printName(name)



// 여러개 바인딩 가능


var myName: String? = "joy"

var yourName: String? = nil


if let name = myName, let friend = yourName {

print("\(name) and \(friend)")

}

// yourName이 nil이기 때문에 실행되지 않는다.


yourName = "haha"


if let name = myName, let friend = yourName {

print("\(name) and \(friend)")

}

// joy and hana







Force Unwrapping

- 옵셔널의 값을 강제로 추출



func printName(_ name: String) {

print(name)

}


var myName: String? = "joy"


printName(myName!)    // joy


myName = nil


print(myName!)

// 강제 추출시 값이 없으므로 런타임 오류 발생


var yourName: String! = nil


printName(yourName)

// nil 값이 전달되기 때문에 런타임 오류 발생




// 강제 추출 하면 오류가 발생할 수 도있기때문에 강제추출 보다는 바인딩 선호






반응형

'# 02 > Swift' 카테고리의 다른 글

[Swift] 클래스  (0) 2020.06.04
[Swift] 구조체  (0) 2020.06.04
[Swift] 반복문  (0) 2020.06.04
[Swift] 조건문  (0) 2020.06.04
[Swift] 함수  (0) 2020.06.04