part1. 옵셔널

구름코딩·2020년 8월 22일
0

옵셔널

  • 값이 있을 수도, 없을 수도 있음을 표현
  • nil이 할당 될 수 있는지 없는지를 표현
func someFunction(someOptionalParam: Int?) {
	//
}
func someFunction(someParam: Int) {
	//
}
someFunction(someOptionalParam: nil) <- 가능
someFunction(someParam: nil)		  <- 불가능

사용

  • 명시적 표현

    1. nil의 가능성을 코드만으로 표현이 가능하다
    2. 문서/주석 작성 시간을 절약할수 있다
  • 안전한 사용

    1. 전달받은 값이 옵셔널이 아니라면 nil체크를 하지 않고 사용가능
    2. 예외 상황을 최소화 하는 안전한 코딩
    3. 효율적인 코딩

문법 및 선언

  • 옵셔널 문법 = enum + generics

옵셔널 선언

enum Optional<Wrapped>: ExpressibleByNiliteral {
	case none
  	case some<Wrapped>
}
let optionalValue: Optinal<Int> = nil
let optionalValue: Int? = nil

옵셔널 표현

느낌표(!)를 이용한 암시적 추출 옵셔널

var optinalValue: `Int!` = 100

switch optinalValue {
case .none:
    print("This Optional variable is nil")
case .some(let value):
    print("Value is \(value)")
}

- 기존 변수처럼 사용 가능, 다른 수를 넣고 계산을 할수 있다
optinalValue = optinalValue + 1

- nil 할당 가능
optinalValue = nil

- 단, nill과의 연산은 불가능 - 잘못된 접근으로 인한 런타임 오류 발생
optinalValue = optinalValue + 1 (에러)

물음표(?)를 이용한 옵셔널

var optionalValue: `Int?` = 100

switch optionalValue {
case .none:
	print("this is Optional variable is nil")
case .some(let value):
	print("value is \(value)")
}

- 기존 변수처럼 사용 불가, 옵셔널과 일반값은 다른 타입으로 연산이 안된다, 즉 다른 수를 넣고 계산하는것이 불가능하다
optionalValue += 1 (에러)

- nil 할당 가능
optionalValue = nil

옵셔널 추출

  • 옵셔널에 들어있는 값을 사용하기 위해 꺼내오는것

옵셔널 추출

옵셔널 바인딩 _ 옵셔널에 값이 있는지 확인할 때 사용

  • nil 체크 + 안전한 추출
  • 옵셔널 안에 값이 들어있는지 확인하고 값이 있으면 값을 꺼낸다
  • if - let 방식을 사용
func printName(what_your_name: String) {
    print(name)
}

var myName: String? = nil

옵셔널타입으로 타입이 달라서 출력 불가

//printName(what_your_name: myName) <- ERROR


//if - let 사용

if let name: String = myName {
    printName(what_your_name: name)
} else {
    print("no_name")
}

myName = "woonsik"
var yourName: String? = "byeori"

//if - let 쉼표를 이용한 연속 사용

if let name1: String = myName, let name2: String = yourName{
    print("my name is \(name1) and his name is \(name2), nice to meet you !")
} else {
    print("nill case")
}

강제 추출

var Myname: String? = "woonsik"
var Yourname: String! = "byeori"

print(**myName!**)
print(**Yourname!**)

뒤에 느낌표(!)를 붙여서 출력한다. nil이 들어있을경우 컴파일 에러가 발생하므로 위험하다

후에 옵셔널 체이닝과 옵셔널 바인딩의 콜라보가 나온다

profile
내꿈은 숲속의잠자는공주

0개의 댓글

관련 채용 정보