간략한 스위프트 문법/사용법 정리
클로저(Closure)는 다른 언어의 람다(lambdas)와 비슷한 개념이다.
🧐 Closure 생성 방법
예시)
아래의 함수는 Int 타입의 매개변수를 받아서 "score: ~~"으로 반환해주는 함수이다.
func getScore(a: Int) -> String {
return "score: \(a)"
}
print(getScore(50))
// 출력: "score: 50"
위의 함수를 클로저로 구현하면 아래와 같다.
let getScore = { (a: Int) -> String in
return "score: \(a)"
}
print(getScore(100))
// 출력: "score: 100"
📎 축약형
- 클로저의 내부 코드가 한 줄 일때 return을 생략할 수 있음.
let getScore = { (a: Int) -> String in
"score: \(a)"
}
- return 타입은 타입 추론에 의해 결정될 수 있으므로, 생략 가능함.
let getScore = { (a: Int) in
"score: \(a)"
}
- 매개변수 타입과 리턴 타입을 클로저 블록 바깥으로 뺄 수 있다.
let getScore: (Int, Int) -> String = { (a, b) in
"score: \(a+b)"
}
// before:
let getScore = { (a: Int, b: Int) -> String in ...
// after:
let getScore: (Int, Int) -> String = { (a, b) in ...
- "(매개변수) in" 을 생략하고, "$0"으로 매개변수를 사용한 문법.
- $0, $1, $2... 형식으로 사용할 수 있다.
let getScore_1: (Int) -> String = { "score: \($0)" }
let getScore_2: (Int, Int) -> String = { "score: \($0 + $1)" }
🧐 클로저 사용 예시
📎 클로저를 함수에 매개변수로 전달하여 사용하기
let source = ["apple", "air", "brown", "red", "orange", "blue", "candy"]
// 1. 특정 알파벳이 들어있는 문자열을 반환해주는 클로저
let containsSomeText: (String, String) -> Bool = { name, find in
if name.contains(find) {
return true
}
return false
}
// 2. 특정 알파벳으로 "시작하는" 문자열을 반환해주는 클로저
let isStartSomeText: (String, String) -> Bool = { name, find in
if name.first?.description == find {
return true
}
return false
}
// 클로저를 사용하는 함수
func someFind(names: [String], find: String, condition: (String, String) -> Bool) -> [String] {
var newNames = [String]()
for name in names {
if condition(name, find) {
newNames.append(name)
}
}
return newNames
}
// "a"가 들어있는 문자열을 반환받음
someFind(names: source, find: "a", condition: containsSomeText) // ["apple", "air", "orange", "candy"]
// "a"로 시작하는 문자열을 반환받음
someFind(names: source, find: "a", condition: isStartSomeText) // ["apple", "air"]
📎 Array.sort() 사용하기
var fruits = ["Apple", "Grape", "Melon", "Banana", "Mango"]
// 기본형
fruits.sort { (lhs, rhs) -> Bool in
return lhs > rhs // 내림차순
}
// 축약형
// case 1
fruits.sort(by: { $0 < $1 } )
// case 2
fruits.sort() { $0 < $1 }
// case 3
fruits.sort { $0 < $1 }
// case 4
fruits.sort(by: <)
👀 Array.sort() vs Array.sorted()
// sort(): return X, 원본 상태 변경 O
fruits.sort()
// sorted(): return O, 원본 상태 변경 X
fruits.sorted()
'iOS(macOS) > Swift' 카테고리의 다른 글
[Swift/문법] 클래스(Class), 구조체(Structure) (0) | 2022.08.10 |
---|---|
[Swift/문법] Enumerations (enum, 열거형) (0) | 2022.08.09 |
[Swift/문법] 제어문(Control flow), Function (0) | 2022.08.04 |
[Swift/문법] Collection(Array, Set, Dictionary) (0) | 2022.07.28 |
[Swift/문법] 변수, 상수, 튜플과 옵셔널 (0) | 2022.07.24 |