Swift Closures Explained!!

Woozoo·2022년 12월 23일
0

[Swift Deep Dive]

목록 보기
2/2
import UIKit

struct Student {
    let name: String
    var testScore: Int
}

let students = [ Student(name: "Luke", testScore: 88),
                 Student(name: "Han", testScore: 73),
                 Student(name: "Leia", testScore: 95),
                 Student(name: "Chewy", testScore: 78),
                 Student(name: "Obi-Wan", testScore: 65),
                 Student(name: "Ahsoka", testScore: 86),
                 Student(name: "Yoda", testScore: 68)
]

var topStudentFilter: (Student) -> Bool = { student in
    return student.testScore > 80
}

func topStudentFilterF(student: Student) -> Bool {
    return student.testScore > 80
}

학생의 이름과 시험점수를 담는 Student struct를 만들고, students 배열을 만들어줬다.
이제 학생들이 담긴 배열에서 높은 점수를 가진 친구들을 걸러보려고 한다.

topStudentFilter라는 closure를 만들고 변수로 할당했다!
(클로저는 상수 변수에 할당가능, 일급객체라서)
참고를 위해 이 형태와 똑같이 만든 함수도 만들어봤다!

똑같은 걸 알겠죠?!

let topStudents = students.filter(topStudentFilter)

for topStudent in topStudents {
    print(topStudent.name)
}

이제 students에서 filter를 해보자
filter 함수에 필요한 파라미터는 어떤 하나의 Element를 받고 Bool 타입으로 리턴을 해야한다
-> topStudentFilter를 넣어주면 되겠구나!!
그리고 필터링 된걸 for 루프를 통해서 출력해보면!


요호~


그럼 $0, $1 같은 건 뭐임?
클로져를 조금 더 간단하게 표현한거임

let topStudents = students.filter { student in
	return student.testScore > 80
}

let topStudents = students.filter { $0.testScore > 80 }

아래 형태로 줄인거! 파라미터이름이었던 student 생략하고
그냥 들어온 첫번째 요소를 $0이라고 표현했다!

필터한 걸 다시 정렬해보자!
정렬을 위해 sorted 함수를 사용하려고 할 때 자동완성이 되는데
받는 파라미터 형태가 두개의 Student를 받는 걸 볼 수 있다!

let studentRanking = topStudents.sorted { student1, student2 in
    return student1.testScore > student2.testScore
}

let studentRanking = topStudents.sorted { $0.testScore > $1.testScore }

이렇게 줄일 수 있음!

profile
우주형

0개의 댓글