Swift 기본 개념 - Set, Optional, Optional Binding

aaaaa·2021년 10월 3일
0

Swift

목록 보기
1/2
post-thumbnail

컬렉션 타입 - set

배열과 다르게 순서가 중요하지 않고, 중복되지 않는 유일한 값들로 이루어져 있다.

let numbers: Set<Int> = [1, 2, 3, 4]

// {2, 3, 4, 1}

set에 사용하는 메소드: union(), sorted(), intersection(), substracting()

let setA: Set<Int> = [1, 2, 3]
let setB: Set<Int> = [3, 4, 5]

let union: Set<Int> = setA.union(setB)  
// {3, 5, 1, 4, 2} : 두 집합의 합집합이 순서 상관 없이 나열되며, 중복되는 값은 한번만 표시된다. 

let sortedUnion: [Int] = union.sorted()
// [1, 2, 3, 4, 5] : union의 값들을 순서대로 정렬하여 배열로 반환한다. 

let intersection: Set<Int> = setA.intersection(setB)
// {3} : 교집합을 set로 반환. 

let substacting: Set<Int> = setA.substracting(setB)
// {1,4, 5, 2} : 차집합을 set로 반환. 

Optional

  • 뜻: 값이 있을 수도, 없을 수도 있다.
  • 필요한 이유: nil의 가능성을 명시적으로 표현해준다.
    • nil 가능성을 문서화하지 않고 코드만으로 표현 가능하다 ⇒ 문서/주석 작성 시간 절약
    • 전달받은 값이 옵셔널이 아니라면 nil 체크를 하지 않더라도 안심하고 사용할 수 있다. ⇒ 효율적이고 안전한 코딩
  • 표현: ! / ?
  • 옵셔널이 아닌 자료형에는 nil을 지정할 수 없다.
func funcWithOpt(someOptionalParam: Int?) {
//...
}
func funcWithoutOpt(someParam: Int) {
//..
}
funcWithOpt(someOptionalParam: nil)
funcWithoutOpt(someParam: nil) // 컴파일 에러

! : 암시적 추출 옵셔널

//기존 변수처럼 사용 가능
optionalValue = optionalValue + 1

//nil 할당 가능
optionalValue = nil

//잘못된 접근으로 인한 런타임 오류 발생 가능
//변수에 nil을 지정했을 경우, 값을 더하면 오류 발생
optionalValue = optionalValue + 1

?

//nil 할당 가능
optionalValue = nil

//기존 변수처럼 사용 불가: 옵셔널과 일반 값은 다른 타입이므로 연산할 수 없다. 
optionalValue = optionalValue + 1

Optional Binding

옵셔널의 값을 꺼내 오는 방법 중 하나로, nil 체크를 하고 안전한 값을 추출할 수 있다.

if-let 구문 사용

func printName(  name:String) {
	print(name)
}
var myName: String!  = nil

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

printName(name)
/* name 상수는 if-let 구문 내에서만 사용할 수 있다. 
상수 사용범위를 벗어났기 때문에 컴파일 오류가 발생한다. */

여러 옵셔널 타입을 바인딩하기

var myName: String? = "song"
var yourName: String? = nil

if let name = myName, let friend = yourName {
	print("\(name) and \(friend)")
}
//쉼표를 사용해서 여러 옵셔널 타입을 바인딩 할 수 있다. 
// yourName이 nil 이기 떄문에 실행되지 않는다. 

yourName = "ko"
//yourName에 값을 할당한 뒤 실행하면 된다. 

if let name = myName, let friend = yourName { 
	print("\(name) and \(friend)")
}
//song and ko

Force Unwrapping

옵셔널의 값을 강제로 추출한다.

func printName(  name:String) {
	print(name)
}
var myName: String?  = "ko"

printName(myName!) //ko!
//옵셔널에 !를 붙여 호출하면 값을 강제로 추출한다. 

myName = nil
print(myname!)
//강제추출시 값이 없으므로 런타임 오류가 발생한다. 

var yourName: String!  = nil

printName(yourName)
//nil값이 전달되기 때문에 런타임 오류가 발생한다. 

0개의 댓글