SW

옵셔널 이해하기 (복습) 본문

프로그래밍/Swift

옵셔널 이해하기 (복습)

LCD 2018. 10. 21. 12:51

옵셔널(Optional) : nil값을 다룰 수 있게 한다.

옵셔널을 사용하려면 ' ? ' 를 사용하여 선언한다. 
ex ) Int? / String? 이런식으로 선언한다.

0과 nil과 는 다르다. 예를 들어  어떠한 상자 안에 아무것도 들어있지 않는 상태가 nil이다. 

0은 0이라는 숫자가 들어 있는 것이다. 사람이 볼 경우에는 존재하지 않다고 생각 할 수 있지만 기계는 그렇지 않다고 한다..



옵셔널 강제추출 (Unwrapped Optional) 


강제추출은 ! 를 사용한다.
?와 !의 가장 큰 차이점은 값을 강제로 추출하기 때문에 옵셔널에 값이 없다면 런타임 오류가 발생한다는 점이다.
또 다른 점을 이야기 하자면 옵셔널에서 값을 강제 추출해 반환하기 때문에 반환하기 때문에 반환 값이 옵셔널이 아니라는 점이다.

Unwraping에서도 세부적으로 나뉜다. 
우선 강제 언래핑 , 옵셔널 바인딩, 암묵적 언래핑으로 나뉜다.

여기서도 암묵적 언래핑은 따로 언래핑하지 않고 사용할 수 있다.


옵셔널 체이닝(Optional Chaining)

class Room{

    var number : Int    // 방 번호

    

    init(number : Int){     //초기화

        self.number = number

    }

}


class Building {    //건물이름

    var name : String

    var room : Room?

    

    init(name : String){

        self.name = name        // 초기화값

    }

}


struct Address {

    var province : String

    var city : String

    var street : String

    var building : Building?

    var detailAddress : String?

}


class Person {

    var name : String

    var address : Address?

    

    init(name: String) {

        self.name = name

    }

}



let SeongWoo : Person = Person(name: "SeongWoo")


SeongWoo.address = Address(province: "서울특별시", city: "서울시", street: "올림픽대로", building: nil, detailAddress: nil)

SeongWoo.address?.building = Building(name: "성집")

SeongWoo.address?.building?.room = Room(number: 0)

SeongWoo.address?.building?.room?.number = 5005



if let roomNumber: Int = SeongWoo.address?.building?.room?.number {

    print(SeongWoo.address!)

} else {

    print("Can not find room number")

}


여기서도 암묵적 언래핑은 따로 언래핑하지 않고 사용할 수 있다.






빠른 종료(Early Exit) 

핵심 키워드 guard

guard 구문은 if 구문과 유사하게 Bool 타입의 값으로 동작하는 기능이다. guard 뒤에 따라 붙는 코드의 실행 결과가 true 일 때 코드가 계속 실행된다. 
if 구문과는 다르게 guard 구문은 항상 else 구문이 뒤에 따라와야 한다. 
만약 guard 뒤에 따라오는 Bool 값이 false 라면 else 블록 내부 코드를 실행하게 된다. 이 때 else 구문의 블록 내부에는 꼭 자신보다 상위 코드 블록을 종료하는 코드가 들어가게 된다.

그래서 특정 조건에 부합하지 않다는 판단이 되면 재빠르게 코드 블록의 실행을 종료 할 수 있다.

코드 블록을 종료할 때는 return, break, continue, throw 등의 제어문 전환 명령을 사용한다. 또는 fatalError() 와 같은 비반환 함수나 메서드도 호출 가능하다.



guard Bool 타입 값 else {

    예외사항 실행문

    제어문 전환 명령어

}



if문과  guard문의 비교 



for i in 0...3 {

    if i == 2 {

        print(i)

    } else {

        continue

    }

}




for i in 0...3 {

    guard i == 2 else {

        continue

    }

    print(i)

}






func greet(_ person: [String: String]) {

    guard let name: String = person["name"] else {

        return

    }

    

    print("Hello \(name)")

    

    guard let location: String = person["location"] else {

        print("I hope the weather is ice near you")

        return

    }

    

    print("I hope the weather is nice in \(location)")

}


var personInfo: [String: String] = [String:String]()

personInfo["name"] = "SeongWoo"


greet(personInfo)


personInfo["location"] = "korea"


greet(personInfo)






























'프로그래밍 > Swift' 카테고리의 다른 글

자동 클로저 (학습)  (0) 2018.10.17
클로저 탈출  (1) 2018.10.17
클로저 값 획득 (복습)  (0) 2018.10.17