옵셔널

hoBahk·2021년 7월 6일
0

1. 옵셔녈 사용

"해당 변수 또는 상수에는 값이 없을수도 있다."
즉, 변수 또는 상수가 nil이 수도 있으므로 사용에 주의하라는 뜻이다.
값이 없는 옵셔널 변수 또는 상수에 접근하려면 런타임 오류가 발생하고, 그렇게 되면 OS가 프로그램을 강제로 종료시킬 확률이 매우 높다.

ex)옵셔널의 사용

var myName: String? = "Park"
print(myName) //Park

myName = nil

print(myName) //nil

옵셔널은 사용 예

마리가 만든 함수에 전달되는 전달인자의 값이 잘못된 값일 경우 제대로 처리하지 못했음을 nil을 반환하여 표현하는 것을 예로 들 수 있다.
심각하지 않은 오류라면 간단히 nil을 반환해서 오류가 있음을 알릴 수 있다.
매개변수를 굳이 넘기지 않아도 된다는 뜻으로 매개변수의 타입을 옵셔널로 정의할 수도 있다.

ex) 원시 값을 통한 열거형 초기화

enum School: String{
   case primary = "유치원"
   case elementary = "초등학교"
   case middle = "중학교"
   case high = "고등학교"
   case college = "대학"
   case university = "대학교"
   case granduate = "대학원"
}
enum Numbers: Int{
    case zero, one, two, ten=10
}

let primary2 = School(rawValue: "유치원") //primary
let grauate = School(rawValue: "석박사") //nil

let one = Numbers(rawValue: 1) // one
let three = Numbers(rawValue: 3) // nil

// 데이터 타입을 명시하지 않고 타입추론기능을 사용하여 데이터 값이 nil일 수도 있다는 것을 말해준다.
// 열거형 옵셔널

ex) switch를 통한 옵셔널 값의 확인(1)

func checkOptionalValue(value optionalValue: Any? ){
    switch optionalValue{
    case .none:
        print("This Optional variable is nil")
    case .some(let value):
        print("Value is \(value)")
    }
}

var myName: String? = "Park"
checkOptionalValue(value: myName) //Value is Park

myName = nil
checkOptionalValue(value: myName) //This Optional variable is nil

ex) switch를 통한 옵셔널 값의 확인(2)

let numbers: [Int?] = [2, nil, -4, nil, 100]

for number in numbers{
    switch number {
    case .some(let value) where value < 0:
        print("Negative value!! \(value)")
    case .some(let value) where value > 10:
        print("Positive value!! \(value)")
    case .some(let value):
        print ("value \(value)")
    case .none:
        print("nil")
    }
}
//value 2
//nil
//Negative value!! -4
//nil
//Positive value!! 100

2. 옵셔널 추출

1) 강제 추출

옵셔널 강제 추출 방식은 옵셔널의 값을 추출하는 가장 간단하지만 가장 위험한 방법이다.
런타임 오류가 발생할 가능성이 크기 때문이다.

ex) 옵셔널 값의 강제 추출

var myName: String? = "Park"

//옵셔널이 아닌 변수에는 옵셔널 값이 들어갈 수 없다. 추출해서 할당해주어야 한다.
var park: String = myName!

myName = nil
//park = myName! // 런타입 오류

//if 구문 등 조건문을 이용해서 조금 더 안전하게 처리해볼 수 있다.
if myName != nil{
    print("My name is \(myName)")
}else{
    print("myName == nil")
}

//myName == nil

2) 옵셔널 바인딩

옵셔널 바인딩은 옵셔널 값이 있는지 확인할 때 사용한다.
만약 옵셔널에 값이 있다면 옵셔널에서 추출한 값을 일정 블록 안에서 사용할 수 있는 상수나 변수로 할당해서 옵셔널이 아린 형태로 사용할 수 있도록 한다.
if문 또는 while문 등과 결합하여 사용할 수 있다.

ex) 옵셔널 바인딩을 사용한 옵셔널 값의 추출

var myName: String? = "park"

//옵셔널 바인딩 통한 임시 상수 할당
if let name = myName{
    print("My Name is \(name)")
}else{
    print("myName == nil")
}

//옵셔널 바인딩 통한 임시 변수 할당
if var name = myName{
    name = "ho" // 변수이므로 내부에서 변경 가능
    print("My name is \(name)")
}else {
    print("myName == nil")
}

ex) 옵셔널 바인딩을 사용한 여러개의 옵셔널 값의 추출

var myName: String? = "Park"
var yourName: String? = nil

//friend에 바인딩이 되지 않으므로 실행되지 않는다.
if let name = myName, let friend = yourName{
    print("We are friend! \(name) & \(friend)")
}

yourName = "alloc"

if let name = myName, let friend = yourName{
    print("We are friend! \(name) & \(friend)")
}
//We are friend! Park & alloc

3) 암시적 추출 옵셔널

nil을 할당해줄 수 있는 옵셔널이 아닌 변수나 상수가 필요할 때 사용
사용하려면 타입 뒤에 느낌표(!)를 적어 사용하면 된다.

ex) 암시적 추출 옵셔널의 사용

var myName: String! = "Park"
print(myName)
myName = nil

//암시적 추출 옵셔널도 바인딩 사용 가능
if let name = myName{
    print("My name is \(name)")
}else{
    print("myName == nil")
}
//myName == nil
profile
호박에 줄 그어서 수박 되는 성장 드라마

0개의 댓글