iOS/정리

[Swift] 기본문법 정리3 - 열거형/옵셔널 체이닝/클로저/클로저 간소화/고차함수

용그무스 2022. 11. 25. 16:24

열거형

// 원시값을 사용하는 열거형
enum 열거형: Type {
	case a = value
}
열거형타입변수.a.rawValue

// 연관값을 사용하는 열거형
enum 열거형 {
	case a(연관값Type)
}
var 열거형타입변수 = 열거형.a(연관값)	// 연관값 초기화
열거형타입변수.a(let b)		// b에 연관값을 대입하게 됨

 

 

옵셔널 체이닝

옵셔널 체이닝 - 옵셔널바인딩 없이 값에 접근
옵셔널타입변수?.프로퍼티	// 옵셔널타입 / Optional(value)
옵셔널타입변수!.프로퍼티	// 강제로 값만 추출

 

 

클로저

closure
- 참조타입
- 코드에서 사용할 수 있는 독립기능 블록
- 일급객채? 전달인자로 보냄, 변수/상수로 저장,전달 가능, 함수의 반환값 가능
- 익명의 함수
- 전달인자가 없음. 파라미터 값만 넘겨야함

{ (매개변수) -> 리턴타입 in		// 헤드
	실행구문			// 바디
}

// 파라미터X, 리턴타입X
let hello = { () -> () in
    print("hello")
}
hello()

// 파라미터O, 리턴타입O
let hello2 = { (name: String) -> (String) in
    return name
}
hello2("hello2")

// 함수의 파라미터로 클로저를 사용
func doSomething(closure: () -> ()) {
    closure()
}
doSomething { () -> () in
    print("hello3")
}

// 함수의 반환타입으로 클로저를 사용
func doSomething2() -> () -> () {
    return { () -> () in
        print("hello4")
    }
}
doSomething2()     // 클로저 네임..
doSomething2()()   // 클로저() ...... print됨

 

 

클로저 간소화

// 후행클로저 - 마지막 매개변수로 전달되는 클로저만 사용가능
// 파라미터, 반환값이 없으면 in까지 생략가능
doSomething() {
    print("hello3")
}

// 다중후행클로저 - 첫번째 클로저는 매개변수 생략가능
func doSomething3(closure1: () -> (), closure2: () -> ()){
    closure1()
    closure2()
}
doSomething3 {
    print("closure1")
} closure2: {
    print("closure2")
}

// 클로저 표현 간소화
func doSomething4(closure: (Int, Int, Int) -> Int){
    closure(1, 2, 3)
}
doSomething4 {
    $0+$1+$2
}

 

고차함수 - map & filter & reduce

// map - 배열의 요소에 접근 (기존배열.count = 새로운배열.count)
let numbers = [0,1,2,3]
let mapArray = numbers.map {
    return $0 * 2
}
print("map - \(mapArray)")

// filter
let numbers2 = [10,50,33,354,544,20]
let filterArray = numbers2.filter {
    $0 % 5 == 0
}
print("filter - \(filterArray)")

// reduce - 요소를 하나로 통합
let numbers3 = [0, 1, 2, 3]
let reduceResult = numbers3.reduce(4) {          // 초기값
    print ("Result - \($0), Element - \($1)")    // result - 누적값, element - 요소
    return $0 + $1
}
print("reduce - \(reduceResult)")