Closure Syntax Optimization
// 문자열 배열중에서 Pro가 포함된 것만 필터링
var proModels = products.filter( { (name: String) -> Bool in
return name.contains("Pro")
})
// Syntax Optimization
// 규칙
// 1. 프레임워크에 구현되어 있는 메소드라면 컴파일러는 프레임워크에 구현되어있는 메소드를 참고해서 추론할 수 있기 때문에
// 파라미터 타입, 리턴형 생략가능
products.filter( { (name) in
return name.contains("Pro")
})
// 2. 파라미터의 이름은 숏텐더 아규먼트 네임으로 대체한다. -> 이 경우 파라미터 이름과 in 키워드는 생략 하고 숏텐더 아규먼트 네임으로 대체
products.filter({
return $0.contains("Pro")
})
// 3. 이제 클로저 표현식에서는 단일 return 문만 남아 있는데 이 경우 return 키워드 생략 -> 인플리쉬 리턴이라고 부른다.
products.filter({
$0.contains("Pro")
})
// 4. 클로저 파라미터가 마지막 파라미터라면 트레일링 클로저로 작성
// 함수나 메소드 호출식 다음에 따라오는 표현식
// 이렇게 하면 인라인 클로저가 트레일링 클로저로 바뀐것.
products.filter() {
$0.contains("Pro")
}
// () 안에 파라미터가 없으면 ()도 생략
products.filte {
$0.contains("Pro")
}
// 대소문자에 관계없이 오름차순 정렬을 직접 구현
proModels.sort(by: { (lhs: String, rhs: String) -> Bool in
return lhs.caseInsensitiveCompare(rhs) == .orderedAscending
})
// 1. 파라미터, 리턴형 생략
proModels.sort(by: { (lhs, rhs) in
return lhs.caseInsensitiveCompare(rhs) == .orderedAscending
})
// 2. 파라미터 이름, in 키워드를 생략하고 숏텐더 아규먼트로 대체
proModels.sort(by: {
return $0.caseInsensitiveCompare($1) == .orderedAscending
})
// 3. 단일 리턴문만 남았다면 return 생략
proModels.sort(by: {
$0.caseInsensitiveCompare($1) == .orderedAscending
})
// 4. 클로저가 마지막 파라미터라면 트레일링 클로저로 작성한다.
// 그리고 지금처럼 argument label이 남아있다면 삭제
proModels.sort(by: ) {
$0.caseInsensitiveCompare($1) == .orderedAscending
}
proModels.sort() {
$0.caseInsensitiveCompare($1) == .orderedAscending
}
// 5. 파라미터가 더 이상 없다면 () 생략
proModels.sort {
$0.caseInsensitiveCompare($1) == .orderedAscending
}