안녕하세요 알통몬입니다. 공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
이번 포스팅에서는 옵셔널에 대해서 공부하겠습니다.
Optional : 값이 있을 수도 있고 없을 수도 있음
Optional을 사용하는 이유는 nil의 가능성을 명시적으로 표현하기 위해서 입니다.
Optional을 사용함으로써 얻을 수 있는 이점
- nil 가능성을 문서화하지 않더라도 코드만으로 충분히 표현 가능합니다.
- 문서나 주석의 작성 시간을 절약할 수 있습니다.
- 전달 받은 값이 옵셔널이 아니라면 nil 체크를 하지 않아도 안심하고 사용할 수 있습니다.
- 효율적으로 코딩을 할 수 있고 예외 상황을 최소화하는 안전한 코딩 방법이 됩니다.
ex)
- Optional
func someFunc1(someOpParam : Int?) {
//.....
}
func someFunc2(someOpParam : Int) {
//.....
}
someFunc1(someOpParam : nil) // 에러 X
someFunc2(someOpParam : nil) // 에러 발생
옵셔널 선언
let val1 : Optional<Int> = nil
let val2 : Int? = nil
옵셔널에는 ? 와 !를 사용할 수 있습니다.
! : 암시적 추출 옵셔널
var opVal : Int! = 10
- 기존 변수처럼 사용가능합니다.
opVal = opVal + 10
- nil을 할당할 수 있습니다.
opVal = nil
- 잘못된 접근은 오류를 발생합니다.
opVal = opVal + 1 ( 위에서 opVal에 nil을 할당했으므로)
?
var opVal2 : Int? = 10
- 기존 변수처럼 사용할 수 없습니다.
opVal2 = opVal2 + 10 // X
- nil을 할당할 수 있습니다.
opVal2 = nil
switch 문에서 사용방법
switch opVal {
case .none
print("no value")
case .some(let val)
print("value is \(val)")
}
옵셔널 추출
추출 방법에는 두 가지가 있습니다.
- 옵셔널 바인딩
: nil 체크를 하고, 안전한 값 추출을 할 수 있음.
ex)
func printName(_ name : String) {
print(name)
}
var myName : String? = nil
printName(myName) // 전달되는 값의 타입이 달르기 때문에 컴파일 오류가 발생합니다.
if - let 방식 사용.
func printName(_ name : String) {
print(name)
}
var myName : String! = nil
if let name : String = myName {
printName(name)
} else {
print("myName == nil")
} // let name 의 name 상수는 if-let 구문 안에서만 사용가능.
var myName : String? = "altong"
var yourName : String? = nil
// if - let 구문은 if - let 구문안에서 사용되는 변수들 모두에 값이 있어야 실행됩니다.
if let i = myName, let you = yourName {
} // yourName이 nil 이기 때문에 실행되지 않습니다.
yourName = "mon"
if let i = myName, let you = yourName {
} // myName 과 yourName에 모두 값이 있으므로 실행
- 옵셔널 강제 추출
: 추천하지 않는 방법입니다.
ex)
func printName(_ name : String) {
print(name)
}
var myName : String? = "altong"
printName(myName!) // 옵셔널 값의 타입을 강제 추출
myName = nil
print(myName!) // 강제 추출 시 값이 없기 때문에 런타임 오류가 발생합니다.
var yourName : String! = nil // 암시적추출 옵셔널 형식은
호출 시 강제 추출을 예상하고 선언하는 것
print(yourName) //호출 시 yourName! 과 같은 효과
이상입니다.
다음 포스팅에서는 구조체와 클래스에 대해 공부하겠습니다.
'Swift3(스위프트3)' 카테고리의 다른 글
swift3 스위프트3 열거형 enum (0) | 2017.07.04 |
---|---|
swift3 스위프트3 구조체(struct)와 클래스(class) (0) | 2017.07.04 |
swift3 스위프트3 조건문(if... else... else if, switch)과 반복문 (for ... in, while, repeat... while) (0) | 2017.07.04 |
swift3 스위프트3 함수 function 선언과 호출 (0) | 2017.07.04 |
Swift3 스위프트3 Any, AnyObject, nil (0) | 2017.07.03 |