iOS Swift(스위프트) : 옵셔널 값처리

기타|2019. 5. 22. 22:06
반응형

iOS 앱 개발을 위해 Swift(스위프트) 공부한 것을 메모한 글입니다.

 

 

옵셔널 타입은 연산이나 결합이 안됨

연산을 하려면 해제(언래핑) 해야 함

 

해제 방식 : 명시적 해제 / 묵시적 해제

  명시적 해제 : 강제(많이 씀) / 비강제

  묵시적 해제 : 컴파일러에 의한 자동 해제 / 연산자를 사용한 자동 해제

 

강제 해제 : 옵셔널 값의 nil 여부와 관계 없이 무조건 해제하는 방식

방법 : 옵셔널 타입의 값 뒤에 '!' 기호만 붙여주면 됨   # ! = 강제 해제 연산자

#var optInt: Int? = 3

print("옵셔널 자체 값 : \(optInt)"    //  옵셔널 자체 값 : Optional(3)

print("!로 강제 해제 : \(optInt!)"     //  !로 강제 해제 : 3

#Int("123")! + 30   //153

값이 nil인 옵셔널 변수에 !를 붙이면 오류가 나므로 강제 해제할땐 옵셔널 값이 nil인지 점검해야 함

 

#  var str ="123"

var intFromStr = Int(str)    //  intFromStr 상수도 옵셔널 타입으로 정의됨  //Optional(123)   이 대입됨

if intFromStr != nil {} else {}    //    != 반드시 앞에 공백을 넣어줘야 함,   강제 해제 연산자 !와 구분하기 위함

 

옵셔널 바인딩 : 조건문 내에서 일반 상수에 옵셔널 값을 대입하는 방식

반드시 조건문에서 사용해야 함, 대입 결과는 true/false

#  var str = "Swift"

if let intFromStr = Int(str) { } else { }    //자연스럽게 옵셔널 타입이 해제됨

intFromStr이 상수로 선언됐고 옵셔널이 아닌 일반 타입임

#guard 구문(#false일때 실행되는 것)

func intStr(str: String) {

   guard let intFromStr = Int(str) else { return }

   프린트

}

 

#절대 nil값이 들어가지 않을 때에는 강제 해제 연산자를 사용해 옵셔널 타입을 처리하는 것이 효율적임

 

#딕셔너리는 기본적으로 옵셔널 타입으로 정의된 값을 반환함, 키가 없을 경우 nil을 반환해야 하므로..

var a = ["kr" : "seoul", ...]

print(a["kr"])   // Optional("Seoul")

print(a["kr"])   // Seoul

#nil 여부를 체크하고 쓰는 것이 맞음

  #if (a["kr"] != nil) {}       or 옵셔널 바인딩 :    if let val  = a["kr"] {}

 

컴파일러에 의한 옵셔널 자동 해제

옵셔널 객체의 값을 비교 연산자로 비교하는 경우 자동해제 됨

한쪽이 옵셔널, 다른 한쪽이 일반 타입일 경우 자동 해제

let t = Int("123")

t == 123  //true         t == Optional(123) //true

옵셔널 값 할당

var ot = optional(123)       

var ot : Int? = 123  //타입 어노테이션을 써야함

 

옵셔널의 묵시적 해제 : 옵셔널 변수를 사용하는 모든 경우에 적용되며 타입 선언시 묵시적 해제를 미리 선언해줘야함

묵시적 옵셔널 선언

#   var str: String! = "Swift"      // !(느낌표)의 차이, 일반 선언은 ?(물음표)

print(str)   //Swift Optional

#  var v1: Int? = 10

v1 + 5 //오류

var v2: Int! = 10

v2 + 5 //15

편리하지만 변수의 값이 nil이 될 가능성이 있다면 묵시적 옵셔널 해제를 쓰면 안됨

묵시적 옵셔널 해제를 사용하는 경우 : 형식상 옵셔널로 정의해야 하지만, 실제로 사용할 때는 절대 nil 값이 대입될 가능성이 없는 변수일 때

#실제 묵시적 옵셔널이 유용하게 사용되는 경우는 클래스나 구조체 내에서임

반응형