Group Study (2021-2022)/iOS

[iOS] 1주차 스터디 - Swift 문법 정리하기

ko_ko 2021. 10. 4. 16:24

강의 영상: https://youtube.com/playlist?list=PLz8NH7YHUj_ZmlgcSETF51Z9GSSU6Uioy

 

Swift Basic - 스위프트 기초문법 강좌

Swift 기초 문법 강의영상입니다. 강의자료를 포함한 자세한 설명은 github페이지를 참고하세요. https://yagom.github.io/swift_basic/

www.youtube.com

컬렉션 타입 - 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값이 전달되기 때문에 런타임 오류가 발생한다.