관리 메뉴

java,javascript,android,php,sql,공부용,메모용

옵셔널 타입 / 옵셔널 바인딩 / Xcode SwiftUI Playground 공부 본문

모바일/SwiftUI ios 공부

옵셔널 타입 / 옵셔널 바인딩 / Xcode SwiftUI Playground 공부

yy_dd2 2021. 9. 7. 07:50
반응형

먼저 옵셔널 타입은 Nil에 대한 이야기다.

나는 책을 읽으면서 먼저 Nil의 이야기는 거의 Null에 대한 이야기같아보여서 검색해서 찾아봤다

쉽게 Objective-C 에서 null과 nil을 따로 사용하면서 잔재로 생긴 것

스위프트에서는 포인터의 개념이 없어서 nil만 가져왔다고 한다 (obc에서 null은 포인터의 부재)

스위프트에서의 nil은 포인터가 아닌 특정 타입에 대한 값의 부재이다.

 

나는 개념이 너무 어려워서 그냥 닐을 널값과 비슷하다고 생각하고 사용할 생각이다.

그게 편하고 빨리 습득 할 수 있을거 같다. 깊이 있게 보면 다른 의미인거 같은데 어렵다..

 

스위프트 옵셔널 타입 optional type

영어의 Optional 은 옵션,선택사양이다 "있어도 되고 없어도 된다"

 

1. 옵셔널 타입 만들기 "?"

- 변수 선언할 때, 데이터 타입 선언 다음에 "?" 문자를 써서 옵셔널이 되도록 한다

- index라는 변수에 Int 타입 변수를 옵셔널로 선언해보기

// 1. 옵셔널로 변수 선언하기
// index라는 변수에 Int 타입 변수를 옵셔널로 선언해보기
var index : Int?

여기서 index. : Int? 는 이제 옵셔널이고 

index는 정숫값이 저장되거나 어떤 값도 저장되지 않을 수 있다.

값이 할당(저장)되지 않는 값은 nil 값을 가진다.

 

 

2. 옵셔널의 값 nil 식별하기

// 1. 옵셔널로 변수 선언하기
// index라는 변수에 Int 타입 변수를 옵셔널로 선언해보기
var index : Int?

// 2. nil 식별하기
if index != nil {
    // index 변수는 값이 할당되어 있다
} else {
    // index 변수는 값이 할당되어 있지 않다
}

+ 옵셔널에 값이 할당되어있으면 해당 값이 옵셔널 내에서 래핑되었다(wrapped / 포장하다) 라고 한다.

+ 옵셔널 안에 할당된 값을 사용할 때는 강제 언래핑(forced unwrapped / 강제로 풀다)의 개념을 사용한다.

 

3. 래핑된 값을 사용할 때는 언래핑을한다 "!"

- 래핑된 값은 옵셔널 데이터 타입에서 옵셔널 이름 뒤에 느낌표 "!"를 두어 추출되도록 한다.

// 3. unwrapping (wrapped값 사용하기)
// 옵셔널로 만든 변수 선언하기
var index2 : Int?
// 변수에 값주기
index2 = 3

var treeArray = ["Oak", "Pine", "Yew", "Birch"]

if index2 != nil {
    // 값을 강제로 언랩핑하기 [index2!]  "!"사용
    print(treeArray[index2!])
} else {
    print("index does not contain a value")
}

옵셔널 바인딩 (Optional Binding)

강제 언랩핑 대신 온셔널로 저장된 값은 옵셔널 바인딩을 이용해 임시 변수나 상수에 할당(저장)될 수 있다.

구문 사용해보기

// 옵셔널 바인딩
if let constantname = optionalName {
    
}
if var variablename = optionalName {
    
}

4. 옵셔널 바인딩 (강제 언래핑 대신 임시 변수나 상수에 할당(저장)해서 사용)

// 4. 옵셔널 바인딩 사용
var index3 : Int?
index3 = 2
var treeArray2 = ["Oak", "Pine", "Yew", "Birch"]
if let opValue = index3 {
    // 값을 강제로 언랩핑하기 [index2!]  "!"사용
    print(treeArray2[opValue])
} else {
    print("index does not contain a value")
}
// if문이 끝마면 같은 이름의 상수 사용가능
let opValue : Int?

 

** 옵셔널 바인딩은 여러 개의 옵셔널을 언래핑하고 조건문을 포함하는 데 사용될 수도 있다.

// 여러 개의 옵셔널을 언래핑 한 후 조건문을 포함하여 사용 가능
if let 상수명1 = 옵셔널 이름1, let 상수명2 = 옵셔널 이름2, let 상수명3 = ..., <조건식> {
    
}

** 옵셔널 바인딩을 사용해 한 줄의 코드 내에 두개의 옵셔널 언래핑하기

// 옵셔널 바인딩을 사용해 한 줄의 코드 내에 두개의 옵셔널을 언래핑해보자

var pet1 : String?
var pet2 : String?

pet1 = "cat"
pet2 = "dog"

if let firstPet = pet1, let secondPet = pet2 {
    print(firstPet)
    print(secondPet)
} else {
    print("insufficient pets")
}

var petCount : Int = 2
// 조건문 사용예
if let firstPet = pet1, let secondPet = pet2, petCount > 1{
    print(firstPet)
    print(secondPet)
} else {
    print("insufficient pets")
}

책에 있는 예제 그대로는 아니고

var petCount : Int = 0옵셔널을 만들어주고 조건문에 사용했다

조건문 사용을 그냥 저렇게 맨뒤에 하면 되는구나 라고 쓰면서 알았다 따로 ()나 <>가 필요없는듯 하다

 

 

** 강제적 언래핑 (값에 강제적으로 접근하기)

물음표(?) 대신 느낌표(!) 사용

강제적 언래핑되도록 옵셔널을 선언하면 강제 언래핑이나 옵셔널 바인딩을 사용하지 않아도 값에 접근이 가능하다.

 

// *강제언래핑 해사 옵셔널바인딩 사용하지 않기
var index4 : Int!   // 이 옵셔널은 강제적으로 언래핑됨
index4 = 1
var treeArray3 = ["Oak", "Pine", "Yew", "Birch"]

if index4 != nil {
    print(treeArray3[index4])
} else {
    print("index4 does not contain a value")
}

 

옵셔널은 할당된 값이 없거나 nil을 할당 할 수 있는 것은 옵셔널 타입만 가능하다.

// 할당된 값이 없거나 nil을 할당 할 수 있는 것은 옵셔널 타입끼리만 가능
// 유효하지 않은 코드 예 3가지
var someInt = nil
var someString : String = nil
let someConstant = nil

 

 

핵심만 골라 배우는 SwiftUI 기반의 iOS 프로그래밍,닐 스미스 지음,황반석 옮김,제이펍 출판

반응형
Comments