Swift문법 - (8)옵셔널(Optional)

Youth·2022년 9월 21일
0

swift문법공부

목록 보기
8/27
post-thumbnail

옵셔널(Optional)타입의 이해

  • 스위프트에서 옵셔널 타입을 사용하는 이유
    • 저장속성에 타입을 선언했는데 아무런 값이 없는경우 접근하면 에러가 발생
  • 타입을 선언한다는 의미 : 반드시 그 타입의 값이 들어있다는 의미]

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)

옵셔널값을 추출하는 방법

1.강제 언래핑(Forced Unwrapping) : 값이 있다는 것이 확실할 때

var str: String? = "안녕하세요"
print(str!) // "안녕하세요"

2.if문으로 nil이 아니라는 것 확인한 후, 강제로 벗기기

if str != nil {
    print(str!)
}

3.옵셔널 바인딩 (if let 바인딩) ⭐️⭐️⭐️

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
}

⭐️가드문(guard statement)⭐️

  • if문의 단점 - 여러조건이 있을때 코드의 가독성이 문제됨 ➞ guard문으로 단점 극복
  • else문을 먼저 배치 - 먼저 조건을 판별하여 조기 종료(early exit)
  • 조건을 만족하는 경우 코드가 다음 줄로 넘어가서 계속 실행
  • 가드문에서 선언된 변수를 아래문장에서 사용 가능 (동일한 스코프로 취급) (guard let 바인딩 관련)
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: "안녕하세요")

4.닐 코얼레싱 연산자 - nil일때 기본값을 정해주는 방법

// serverName(Optional String)이 nil이면 기본값으로 "미인증사용자"
// 따라서 userName은 String
var userName = serverName ?? "미인증사용자"
profile
AppleDeveloperAcademy@POSTECH 1기 수료, SOPT 32기 iOS파트 수료

0개의 댓글