[Swift 로드맵] Optional

징니·2023년 7월 25일
0

Swift 로드맵

목록 보기
4/5

값이 있을 수도 없을 수도 있는 상황에서 사용

nil

nil은 옵셔널로 선언된 곳에서만 사용이 가능합니다!

데이터 타입 뒤에 물음표(?) 또는 Optional<>을 이용하여 나타냅니다.

그러나 물음표(?)가 더 간단하기에 굳이 긴 표현을 사용하지 않습니다!

var fruit: String?
// = var fruit: Optional<String>
fruit = nil
print(fruit) // nil

옵셔널은 ExpressibleByNilLiteral 프로토콜을 따른다!

public enum Optional<Wrapped>: ExpressibleByNilLiteral {
	case none
	case some(Wrapped)
	public init(_ some: Wrapped)
	...
}
func checkOptional(value OptionalValue: Any?) {
	switch optionalValue {
			case .none:
				print("This Optional variable is nil")
			case .some(let value):
				print("Value is \(value)")
	}
}

따라서 이런 식으로 switch로 optional 처리가 가능합니다

Optional binding

optional 값을 추출하는 방법으로는

  1. 느낌표(!)를 사용하여 강제 추출하는 방법
  2. 옵셔널 바인딩 (if let, guard let)
  3. 암시적 추출 옵셔널(IUO)

여기서 옵셔널 바인딩이란 if let, guard let, if var ,guard var를 통해 값이 있는 지 확인합니다.

var fruit: String? = "grape"

if let ff = fruit {
	print("ff is \(fruit)")
} else {
	print("fruit is nil")
}
// ff is grape

변수를 사용하고 싶다면 If var, guard var를 사용하고, 여러 개를 사용하고 싶다면 쉼표(,)를 통해 사용합니다!

주의! 1번과 3번은 오류가 생기지 않는다는 전제 하에 사용하므로 굉장히 위험한 방법이므로 지양합시다

Optional Chainning

옵셔널은 반복적으로 사용하여 옵셔널이 자전거 체인처럼 한 칸이라도 없으면 전체가 동작하지 않는 것을 의미합니다!

하나라도 값이 없으면 nil을 반환!

class Vegetable {
    var taste: String
    var school: School?
    
    init(taste: String) {
        self.taste = taste
    }
}

struct School {
    var student: String
    var teacher: String
    var vegetable: Vegetable?
}

class Fruit {
    var name: String
    var school: School?

    init(name: String) {
        self.name = name
    }
}

let fruit: Fruit = Fruit(name: "grape")

if let chair: String = fruit.school?.vegetable?.taste {
    print(chair)
} else {
    print("Can not find")
}

nil을 반환하는 것을 알 수 있습니다.

profile
iOS 개발자입니다

0개의 댓글

관련 채용 정보