swift 문법 총정리(6) Closure
Updated:
Closure
//func
func sayHi() -> String {
return "Hello"
}
//closure
var sayGreet = { () -> String in
return "Hello"
}
sayGreet()
//func
func sayHi(name: String) -> String{
return "\(name) Hello1"
}
sayHi(name: "jin")
//"jin Hello1"
//closure
var sayGreet = { (name: String) -> String in
return "\(name) Hello2"
}
sayGreet("jin")
//파라미터 이름을 쓸 필요가 없다.
//type inference(타입 추론) return type을 예상한다.
var sayGreet2 = { (fistName: String, lastName: String) in
return "\(firstName + lastName) Hello2"
}
// implicit Returns from Single-express closure(암시적 리턴(변환) - 한줄일때만)
var sayGreet3: (String, String) -> String = { (firstName, lastName) in
"\(firstName + lastName) Hello2"
}
//Shortand Arguments Names(인자 이름 축약)
var sayGreet4: (String, String) -> String = { $0 + $1 }
sayGreet4("j","h"
//"jh"
- return type을 적지 않아도 됟나.
- 암시적 생략 : return 키워드도 지울 수 있다. (단, 로직이 한줄만 존재할 경우, 바로 다음값이 리턴임을 알 수 있다.)
Closure Expert
var names = ["apple", "lemon", "brown", "red", "band", "candy"]
// filter a로 시작, b로 시작
//func
func fileString(dates: [String], firstString: String) -> [String]{
var newDatas = [String]()
for index in 0..<datas.count{
if datas[index].first?.description == firstString{
newDatas.append(datas[index])
}
}
return newDatas
}
filterStrings(datas: names, firstString: "a")
//closure
func filterStringClosure(datas: [String], closure: (String) -> Bool ) -> [String]{
var newDatas = [String]()
for data in datas{
if closure(data) == true {
newDatas.append(data
}
}
return newDatas
}
let filtered = filterStringClosure(datas: names) { (element) -> Bool in
if element.first?.description == "a"{
return true
}
return false
}
print(filtered)
//func으로 하면 훨씬 코드가 간결하지만 closure로 만드는 이유는 조건을 closure로 잡아두면 실행하는 순간에 조건을 확인하기가 편하다.
//즉, func에서는 조건 변경시 수정이 아주 까다롭다.
var findA: (String) -> Bool = { element in
if element.first?.description == "a" {
return true
}
return false
}
var findB: (String) -> Bool = { element in
if element.first?.description == "b" {
return true
}
return false
}
filterStringClosure(datas: name, closure: findA)
filterStringClosure(datas: name, closure: findB)
//조건을 이런식으로 선언해두면 변형해주기가 아주 쉽다.
//이런식으로
var stringLength5: (String) -> Bool = {element in
if element.count == 5 {
return true
}
return false
}
filterStringClosure(datas: name, closure: stringLength5)
//엄청 편한 방법이고, 읽기도 쉬워지고 오류 수정도 쉬워진다. 깔끔한 로직을 위해서는 필요하다.
Closure + func
이렇게 사용하는 경우가 대부분이다.
func greeting(name: String) -> String{
return "hi" + name
}
greeting(name: "jin")
func greetingClosure(name: String) -> () -> String{
return {"h1" + name}
}
greetingClosure(name: "minho")()
//괄호를 뒤에 붙이는 이유는 : function뒷부분과 closure가 정의해주는게 똑같다.
//closure와 함수와 다른점은 이름이 없고type 설정만 해주는 것이다.
//함수도 실행을 위해서는 뒤에 ()를 붙여준다. 같은원리로 closure도 실행을 하기위해서는 ()를 붙인다고 보면 된다.
//function의 구조를 그대로 가져다 사용한다.
//원래 마지막도 return { return "h1" + name } 인데 생략해 준 것이다.
Reference
인프런 강의
Leave a comment