-
Swift #6 - nil과 옵셔널Swift의 온도 2021. 1. 8. 01:29
1. nil과 옵셔널 타입
- nil
#다른 언의 null에 해당
#값이 할당되지 않은 상태
#기본 타입(Int, Bool)에도 nil 가능
#값이 0과 값이 nil
- 옵셔널 타입
#일반 변수/상수 : nil 대입 불가
#옵셔널 타입 : nil을 다룰 수 있는 타입
- nil 대입
#변수/상수에 nil 대입
*일반 변수(상수)는 nil이 될 수 없다
*일반 변수에 nil대입 - 에러
- 옵셔널
#옵셔널 타입*nil 값이 될 수 있는 변수/상수*타입 뒤에 물음표(?)로 선언*타입 선언 필수var optionalVar : Optional<Int>var optionalVar2 : Int?#옵셔널 타입의 특징*nil 대입 가능var optionalVar : Int? = 3optionalVar = nil*자동 초기화var optionalVar : Int?print(optionalVar) // nilcs - nil 결과
#결과가 nil이 되는 행위
*동작 결과가 nil 가능
*결과 타입이 옵셔널 타입
*타입변환
let intFromStr = Int("a")intFromStr // Int?cs *딕셔너리
let numbers = ["one":1, "two":2]let three = numbers["three"]cs - 콜렉션과 옵셔널
*배열var array1 : [String]?var array2 = [String?]*딕셔너리var dic1 = [String : Int]?var dic2 = [String : Int?cs 2. 옵셔널 타입 사용하기
- 옵셔널 사용
#객체나 데이터 다루기
*객체나 데이터를 이용한 함수, 프로퍼티, 첨자 접근 등
*유효한 객체나 유효한 값에서 정상 동작
*nil에서는 - 비정상 동작
#옵셔널 타입 사용
*옵셔널 타입의 객체는 nil일 수도 있다.
*그래서 옵셔널 타입 객체는 다른 사용 방법
*nil인 경우와 nil아닌 경우 고려
- 옵셔널 타입의 객체 사용
#옵셔널 타입 : nil 이거나 혹은 유효한 값
#언래핑 : 옵셔널 타입의 변수에서 유효한 값 얻어오기
#nil 여부 비교, 옵셔널 바인딩
#옵셔널 체인
#강제 언래핑
- nil 검사하기
*if, guardvar optionalStr : String?if optionalStr != nil {print("nil이 아니다!")}else {print("nil이다")}*조건문 작성하기 : != nil, == nil 조건 생략 불가if optionalVal {}cs - 옵셔널 바인딩
#if/guard 와 함께 사용
#옵셔널 타입에서 유효한 값을 상수에 대입
#바인딩 된 타입은 일반(Non-Optional) 타입
#nil인 경우 else로 동작
*if를 이용한 옵셔널 바인딩if let realStr = optionalStr {print("문자열의 값\(realStr)")}else {print("문자열이 nil이다");}cs - 옵셔널 바인딩 : guard
*바인딩 된 상수의 범위(scope)func bindingWithWhere() {guard let val = nilAvailable, val > 0 else {return;}print("val은 유효하고 0보다 큰 값이다\(val)")}cs *다중 바인딩, 함수 호출(옵셔널 타입 변환)if let val1 = someFunc(),let val2 = anotherFunc() {//코드}*옵셔널 바인딩 체인if let val1 = nilAvailableStr,let val2 = Int(val1) {// 코드}*옵셔널 바인딩과 조건 비교if let val = someFunc(). condition == true {//코드}cs - nil 연산자
#nil 연산자 : ??
*nil이면 ?? 연산자 이후의 값 아용
*기본값 설정으로 활용 가능
var userSelectedColor : String?//nil이면 Red를 사용var colorName = userSelectedColor ?? "Red"cs - 옵셔널 체인
#옵셔널 객체에 ?기호를 이용해서 직접 사용
#평가 결과가 nil이면 진행하지 않고 nil 반환
#평가 결과가 nil이 아니면 계속 진행(언래핑)
#최종 결과는 옵셔널
#메소드 호출, 프로퍼티 접근, 배열 원소 접근 등
*유효한 값인 경우var optionalStr : String? = "ABC"let str = optionalStr?.lowercased()str // 결과는 옵셔널 Optional("abc")*nil인 경우optionalStr = nillet str2 = optionalStr?.lowercased() // lowercased() 진행 안함str2 // 결과는 nilcs *프로퍼티 접근/메소드 호출/배열, 딕셔너리 접근 등let array : [String]? = ["A", "B", "C"]let str3 = array?[1].lowercased()cs 3. 강제 언래핑
#기호사용
#nil 여부와 관계 없이 언래핑 시도
#타입 선언이나 옵셔널 체인에 사용
#언래핑 결과
*nil 이면 에러
*nil 이 아니면 언래핑
*옵셔널 객체 반환 - Int? 타입 객체 반환let inVal1 = Int("1")*강제 언래핑 - Int 타입 객체 반환let intVal2 = Int("1")!cs - 강제 언래핑 사용 사례
*객체 생성(Failable Initializer)
*메소드 호출, 프로퍼티 접근
*옵셔널 체인
- 강제 언래핑 사용 예
*강제 언래핑 시도 - nil이면 런타임 에러 - 주의!*변환 실패let val = Int("A")! // Error*딕셔너리 원소 접근 - 언래핑 성공let dictionary = ["one":1, "two":2]let two = dictionary["two"]!*언래핑 실패 - 에러 발생let three = dictionary["three"]!cs - 강제 언래핑과 옵셔널 체인
#옵셔널 체인에 강제 언래핑 사용
#언래핑 실패 시 런타임 에러
var optionalStr : String? = "ABC"let str1 = optionalStr!.lowercased()cs - 암시적 언래핑 옵셔널
#Implicitly Unwrapping Optional, IUO
#타입 선언 뒤에 !
#nil 다루기 가능
#nil로 자동 초기화
#자동으로 언래핑
var iuoVal : int! = 123iuoVal = nilcs #암시적 언래핑 옵셔널 사용하기
*?, ! 기호 없이 직접 사용 가능let iuoStr : String! = "Hello, Swift"iuoStr.lowercased()*nil인 경우 런타임 에러 - 주의iuoStr = niliuoStr.lowercased()cs 'Swift의 온도' 카테고리의 다른 글
Swift #8 - 클래스 (0) 2021.01.13 Swift #7 - 함수 (0) 2021.01.12 Swift #5 - 제어문 (0) 2021.01.07 Swift #4 - 다수의 데이터 다루기 (0) 2021.01.06 Swift #3 - 문자와 문자열 (0) 2021.01.05