본문 바로가기
iOS Swift/문법

[Swift] Optionals

by 야고이 2024. 2. 21.
728x90

240221

240314

 

강의

Optional Type : 값을 저장하지 않아도 되는 타입

 

중요 : 변수와 상수는 값을 읽기전에 반드시 초기화 되어야 한다
Non-optional Type 넌옵셔널 타입 : 변수와 상수는 반드시 타입에 맞는 값을 가지고 있어야한다. 우리가 지금까지 선언한 변수 상수 값들,,

값이 없다는 걸 설명해야함
    let stock: Int = 0 -> 상수를 잘못 이해하게 되고 논리적인 에러가 될 수 있다
    let stock: String = "out of stock" -> 문자열은 오타가 날 수 있으니 좋은 방법이 아님

let stock: Int? = nil //nil : 값이 없다는 뜻. 타입이 없음. 타입을 명시적으로 선언해야한다.

let str: String = "Swift" 
//지금까지 선언한 모든 타입은 non-optional type : 항상 값을 가져야 한다.nil을 저장할 수 없다

let optionalStr: String? = nil

let a: Int? = nil
let b = a //b에도 nil이 저장 된다

let c: Optional<Int> = nil //?->물음표대신 <>브라캣 똑같은 식



Unwrapping == 값을 추출한다. 옵셔널은 값을 사용하려면 값을 꺼내야 한다.

Forced Unwrapping 필요한 경우에만 제한적으로 사용하는게 좋다

var num: Int? = nil
print(num) //nil

num = 123
print(num) //Optional(123)

print(num) //결과값 : Optional(123)
print(num!) // ! --> 강제추출. 결과값 : 123

num = nil // nil로 다시 선언
//print(num!) // 값이 없는데 강제 추출하면 에러남 
//[에러문구] Unexpectedly found nil while unwrapping an Optional value

//그렇다면 ! 값이 있는지~ 없는지~ 확인해 보면 되겠지?
//값을 꺼내기 전에 값이 있는지 확인

if num != nil { ///nil 이 아니라면 조건문 실행 !
    print(num!) //강제추출 !!
}
// if문 실행 안됨. 당연함. num이 nil이기 떄문


num = 123
let before = num //before 타입 : 옵셔널
let after = num! //after 타입 : 넌옵셔널

//optional type 을 unwrapping 하면 항상 non-optional type 이 된다

 

 

Optional binding :

Forced Unwrapping과 다르게 옵셔널 표현식에 값이 저장되어 있는 경우에만 Unwrapping 해서 강제 추출에서 발생했던 에러가 발생하지 않고 안전하다.

 

if let name: Type = OptionalEpression  {
statements
}
    
while let name: Type = OptionalEpression {
statements
}
    
guard let name: Type = OptionalEpression else {
statements
}

 if 문 바인딩

var num: Int? = 123

//위에서 if 문으로 nil을 확인했던 코드
if num != nil {
    print(num!)
}

//============
//옵셔널 바인딩
if let n = num {
    print(n)
}

//같은 이름으로 상수를 선언해도 된다. 이름이 같다면 "=num" 생략 가능
//num 은 임시상수. 스코프 안에서만 사용 가능하다
if let num {
    print(num) //여기 num 은 위에 선언한 상수 num 이다
}

guard 문 바인딩

가드문은 값이 있으면 정상적으로 언랩되어, 아래 코드 마지막 줄의 srt 이 성공적으로 언랩핑 되어서 값이 나오게 된다

else 블록은 실행 되지 않는다 

var str: String? = "Swift"
guard let str else {
    str //여기서 접근한 str은 가드문에 선언한 상수가 아니라 위에서 선언한 변수이다
    fatalError()
}
str //가드문으로 바인딩한 상수는 가드문 이후에 접근할 수 있다

 

Q: 가드문 안에 접근한 srt 은 왜 위에서 선언한 변수 이지...?

A: 가드문은 false 일때 실행 되므로, 가드문에 선언된 임시상수는 들어올 수 없지!

 

여러개의 바인딩을 동시에 사용할 수도 있다

let a: Int? = 12
let b: String? = "str"

if let a, let b, b.count > 5 {
    
}

지적과 첨언은 언제나 환영입니다

728x90

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

[Swift] String Comparison & Searching  (0) 2024.02.21
[Swift] String Editing #2  (0) 2024.02.21
[Swift] String Editing #1  (0) 2024.02.21
[Swift] String Basics  (0) 2024.02.21
[Swift] String Index  (0) 2024.02.20

댓글