구조상으로 함수와 비슷하다.
//function
func myScore(a: Int) -> String {
return"\(a)점"
}
let score = myscore(a: 40) //받아오는 이름이 있음
score //"40점"
//closure
let myScore2 = { (a: Int) -> String in
return "\(a)점"
}
myScore2(20) //"20점"
클로저는 이름이 없는 함수이다.
클로저의 축약형
let myScore3 = { (a: Int) -> String in
"\(a)점" //한 줄일 경우 return 생략 가능
let myScore4 = { (a: Int) in //타입추론이 가능.
"\(a)점"
let myScore5: (Int) -> String = { a in //타입을 미리 지정한다. (var a: Int = 10) 처럼
"\(a)점"
}
let myScore6: (Int, Int, Int) -> String = { //in이 생략됐다면 $를 쓰겠다고 생각
"\($0 + $1 + $2)점" //한줄이라 retutn 생략됨
}
클로저 활용
//특정한 글자가 포함된 것을 찾는 함수
//입력한 글자로 시작하는 첫글자를 찾는다.
let names = ["apple", "air", "brown, "red", "orange", "blue", "candy"]
let containsSomeText: (String) -> Bool = { name, find in
if name.contains(find) {
return true
}
return false
}
let is StartSomeText: (String, String) -> Bool = { name, find in
if name.First?.description == find { //description 은 String타입으로 변환해줌
return true
}
return false
}
func find(findString: String, condition: (String, String) -> Bool) -> [String] {
var newNames = [String]()
for name in names {
if condition(name, findString) {
newNames.append(name)
}
}
return newNames
}
find(findString: "a", condition: containsSomeText)
------------------------------------------------
func someFind(find: String) -> [String] {
var newNames = [String]()
for name in names {
name.contains(find) {
}
}
return newNames
}
sort() 는 원본 자체를 정렬,
sorted()는 리턴이 있음
names.sort { (lhs, rhs) -> Bool in
return lhs > rhs
}
names.sort{ $0 < $1 }
names.sort{ $0 < $1 }
names.sort(by: <)
다 같음
타입분류
enum BookType {
case fiction
case comics
case workbook
}
var bookStyle: BookType? //어떤 북타입일지 모름
var books = [BookType]()
func saveBook(book: BookType) {
if boook == .comics {
...(스위치문 등등)
}
}