[Swift 문법] Optional

!·2022년 6월 23일
0

Swift 문법

목록 보기
9/27

Optional이란?

  • Optional의 개념은 nil의 가능성을 문서화하지 않아도 코드만으로 충분히 표현 가능하도록 한다.
  • 이는 Optional이 아닌 경우에 별도의 검사 없이 코드를 작성할 수 있도록하여 안정성을 보장한다.
  • nil 을 할당할 수도 있지만, 할당하지 않아도 되는 타입 이다.
  • Optional 타입은 열거형이기때문에 switch문으로 접근이 가능하다.
  • Optional 은 기본 데이터 타입과 다른 타입이다. (연산이 허용되지 않는다.)
func someFuction(someOptionalParam : Int?){}
func someFuction2(someParam : Int){}

someFuction(someOptionalParam : nil)
someFuction2(someParam : nil) // 컴파일 에러
public enum Optional<Wrapped> : ExoerssibleByNilLiteral{
	case none:
    case some(Wrapped)
    public init(_ some: Wrapped)
    // ...

Optional 생성

  • 타입 뒤에 ? 붙히면 된다.
  • Int?Int는 다른 변수 타입으로써, 연산이 불가능하다. 다른 기본 타입에 대해서도 마찬가지이다.
  • 타입 뒤에 ? 를 붙여 옵셔널 타입을 생성할 수도 있지만, Optinal<Type> 을 통해 옵셔널 변수나 상수를 생성할 수도 있다.
var optionalValue : Int? = 100
switch optionalValue{
	case .none:
    	print("this is nil)
    case .some(let value)
    	print("this is \(value))
}
optionalValue = nil // 할당 가능
optionaValue = optionaValue + 1 // 다른 타입이므로 연산이 불가능하다.

var op1 : Optinal<Int> = 3
var op2 : Int? = 3

암시적 추출 옵셔널

  • 타입 뒤에 ! 붙히면 된다.
  • ?를 붙히는 옵셔널과 다르게 기존 변수처럼 사용(연산)이 가능하다. (일반 데이터 타입과 암시적 추출 옵셔널 데이터 타입 사이의 연산)
  • 단, nil 인경우에는 연산 등이 불가능하다. (런타임 오류 발생)
var optionalValue : Int! = 100
switch optionalValue{
case .none:
	print("this is nil)
case .some(let value):
	print("this is \(value)")
} 

optionalValue = optionalValue + 1 // 가능
optionalValue = nil
optionalValue = optionaValue + 1 // 런타임 에러 발생
---

Optional Unwrapping

  • Optional Unwrapping 이란 Optional 타입의 값을 추출하는 것을 의미한다.
  • Optional Unwrapping 에는 옵셔널 바인딩강제추출이 존재한다,

Optional Binding(옵셔널 바인딩)

  • nil 체크와 안전하게 값을 추출하는 방법이다.
  • if-let 구문을 이용해 값을 추출한다.
  • 여러개의 값에 대해서도 if-let구문을 구성할 수 있다.
  • 단, 여러개의 값에 대해 하나라도 nil 이라면 else 구문이 실행된다.
func printName(_ name : String){
	print(name)
}
var myName : String! = nil

if let name: String = myName{
	printName(name)
} else{
	print("myName == nil")
} // let name 상수는 if-let 구문 안에서만 사용가능하다.
-----------------------------------------------
var myName : String? = "lee"
var yourName : String? = nil

if let name = myNAme, let friend = yourName{
	print("\(name) and \(friend)")
} // yourName가 nil이기때문에 실행되지 않는다.

yourName = "yagom"
if let name = myNAme, let friend = yourName{
	print("\(name) and \(friend)")
} // lee and yagom

Force Unwrapping(강제추출)

  • nil 인지 검사하지않고 추출하기떄문에, 권장되는 방식은 아니다.
  • nil 일 시 런타임 에러가 발생한다.
  • 값 뒤에 ! 를 붙여 수행한다.
func printName(_ name : String){
	print(name)
}
var myName : String? = "lee"
printName(myName!) // lee
myName = nil
print(myName!) // 런타임 오류 발생
var yourName : String! = nil
printName(yourName) // 런타임 오류 발생
profile
개발자 지망생

0개의 댓글