struct MyStruct {
static let club = "iOS부서"
static func doPrinting() {
print("소속은 \(self.club)입니다.")
}
}
struct MyStruct {
static let club = "iOS부서"
func doPrinting() {
print("소속은 \(MyStruct.club)입니다.")
}
}
//프로토콜에서 Self의 사용
extension BinaryInteger {
func squared() -> Self { // 타입자체(Int)를 가르킴
return self * self // 인스턴스(7)를 가르킴
}
}
함수를 변수에 할당할 수 있음
함수를 호출할 때, 함수를 파라미터로 전달할 수 있음
함수에서 함수를 반환할 수 있음
// 1) (클로저를 파라미터로 받는 함수)정의
func closureParamFunction(closure: () -> ()) {
print("프린트 시작")
closure()
}
// 파라미터로 사용할 함수/클로저를 정의
func printSwiftFunction() { // 함수를 정의
print("프린트 종료")
}
let printSwift = { () -> () in // 클로저를 정의
print("프린트 종료")
}
// 함수를 파라미터로 넣으면서 실행 (그동안에 배운 형태로 실행한다면)
closureParamFunction(closure: printSwiftFunction)
closureParamFunction(closure: printSwift)
// 2) 함수를 실행할때 클로저 형태로 전달 (클로저를 사용하는 이유)
closureParamFunction(closure: { () -> () in
print("프린트 종료") // 본래 정의된 함수를 실행시키면서, 클로저를 사후적으로 정의 가능
}) // (활용도가 늘어남)
closureParamFunction(closure: { () -> () in
print("프린트 종료 - 1")
print("프린트 종료 - 2")
})
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
// 오른쪽에 만들기
let modity = UIContextualAction(style: .normal, title: "수정") { (UIContextualAction, UIView, success: @escaping (Bool) -> Void) in
print("수정 클릭 됨")
success(true)
}
modity.backgroundColor = .systemBlue
let delete = UIContextualAction(style: .normal, title: "삭제") { (UIContextualAction, UIView, success: @escaping (Bool) -> Void) in
print("삭제 클릭 됨")
success(true)
}
delete.backgroundColor = .systemRed
//actions배열 인덱스 0이 오른쪽에 붙어서 나옴
return UISwipeActionsConfiguration(actions:[delete, modity])
}
//캡처
var stored = 0
let closure = { (number: Int) -> Int in
stored += number
return stored
}
closure(3) // 3
closure(4) // 7
closure(5) // 12
stored = 0
closure(5) // 5
// 함수 내에서 함수를 실행하고, 값을 리턴하는 일반적인 함수
func calculate(number: Int) -> Int {
var sum = 0
func square(num: Int) -> Int {
sum += (num * num)
return sum
}
let result = square(num: number)
return result
}
calculate(number: 10) //100
calculate(number: 20) //400
calculate(number: 30) //900
// 🌟 캡처가 발생
func calculateFunc() -> ((Int) -> Int) {
var sum = 0
func square(num: Int) -> Int {
sum += (num * num)
return sum
}
return square
}
// 변수에 저장하는 경우(Heap 메모리에 유지)
var squareFunc = calculateFunc()
squareFunc(10) // 100
squareFunc(20) // 500
squareFunc(30) // 1400
// 레퍼런스 타입
var dodoFunc = squareFunc
dodoFunc(20) // 1800
// 어떤 함수의 내부에 존재하는 클로저(함수)를 외부 변수에 저장할 경우
var aSavedFunction: () -> () = { print("출력") }
//aSavedFunction()
func performEscaping2(closure: @escaping () -> ()) {
aSavedFunction = closure // 클로저를 실행하는 것이 아니라 aSavedFunction 변수에 저장
//closure()
}
//aSavedFunction()
performEscaping2(closure: { print("다르게 출력") })
//aSavedFunction()