2021년 11월 17일에 공부한 내용입니다.
func printName(_ name: String) {
print(name)
}
var myName: String? = nil
printName(myName)
// 전달되는 값의 타입이 다르기 때문에 컴파일 오류 발생
// 옵셔널(myName)은 일반 String 타입과 다르게 취급된다.
var myName: String! = nil
if let name: String = myName {
printName(name)
} else {
print("myName == nil")
}
// name 상수는 if-let 구문 내에서만 사용 가능하다.
// 상수 사용범위를 벗어났기 때문에 컴파일 오류가 발생한다.
// printName(name)
// 쉼표(,)를 사용해 여러 옵셔널 변수들을 한꺼번에 바인딩할 수 있다.
// 모든 옵셔널에 값이 있을 때만 동작한다.
var myName: String? = "240"
var yourName: String? = nil
if let name = myName, let friend = yourName {
print("\(name) and \(friend)")
}
// yourName이 nil이기 때문에 실행되지 않는다.
// yourName에 값을 할당해주면 정상적으로 실행된다.
yourName = "Beomgyu"
if let name = myName, let friend = yourName {
print("\(name) and \(friend)")
}
// 240 and Beomgyu
func printName(_ name: String) {
print(name)
}
var myName: String? = "240"
// ! -> 옵셔널 타입의 값을 강제로 추출한다
printName(myName!) // 240
myName = nil
print(myName!)
// 강제 추출시 값이 없으므로 런타임 오류가 발생한다.
// 암시적 추출 옵셔널 형식은 처음 선언할 때부터 위를 가정하고 선언하는 것과 같다.
var yourName: String! = nil
printName(yourName) // !를 붙이지 않아도 암시적 추출 옵셔널 형식 값을 전달할 수 있다.
// 알아서 느낌표를 붙여준 것과 같다.
// nil 값이 전달되기 때문에 런타임 오류가 발생한다.