nil : 값이 없음을 표현하는 키워드(실제로 값이 없다는 의미는 아님)
실제로 optional은 enum타입으로 Optional타입과 nil타입이 있다
즉 nil은 값이 없음을 나타내는 “타입“이라고 할 수있고
Optional과 nil모두 Unwrapping을 통해서 실제값과 값없음에 접근할 수 있다
(nil일때 unwrapping을 하면 에러가 발생한다 → 바로 에러 발생하는걸 방지해준다)
//var optionalNum = nil // 불가능한 형태
// (옵셔널은 추론할 형식이 없기 때문에 반드시 타입 어노테이션으로 초기화해야됨)
// **옵셔널은 늘 변수로 선언**해야함
**// 타입어노테이션 -> 타입과 값 모두를 설정해주는것**
var optionalNum: Int? = nil
// Optional(10)
// 실제값을 알기위해선 unwrapping을 해줘야함
print(optionalNum)
var a: Int? = 7 // 옵셔널 인트
var b = a // 값을 복사해서 담는 다면 타입은?
print(b) // Optional(7)
var c: Int = 5
// Int를 Int?타입에 담을 수는 있다(좁은건 넓은거에 담길 수 있다)
// 어쨌든 타입이 Int? 타입으로 바뀌어서 담김
b = c
print(b) // Optional(5)
var str: String? = "안녕하세요"
print(str!) // "안녕하세요"
if str != nil {
print(str!)
}
if let s = str { // s라는 상수에 담긴다면 // nil
print(s)
}
swift 5.7부터는 조금더 간소화된 if 옵셔널 바인딩이 가능
if let str {
print(str)
}
**함수내에서는 guard let바인딩을 사용 왜냐면 return을 사용해야하기 때문**
func doSomething(name: String?) -> String {
guard let n = name else { return "gg" }
return n
}
func checkNumbersOf1(password: String) -> Bool {
if password.count >= 6 {
// 로그인을 처리하는 코드 작성
return true
} else {
return false
}
}
func checkNumbersOf2(password: String) -> Bool {
// 감시하다
guard password.count >= 6 else { return false }
// 로그인을 처리하는 코드 작성
return true
}
⭐️실제사용 예시⭐️
func check(words: String) -> Bool {
guard words.count >= 5 else {
print("5글자 이하입니다.")
return false // 종료 조건 - 함수 내에서는 return / throw
}
print("\(words.count)글자입니다.")
return true
}
check(words: "안녕하세요")
// serverName(Optional String)이 nil이면 기본값으로 "미인증사용자"
// 따라서 userName은 String
var userName = serverName ?? "미인증사용자"