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 |
댓글