100 days of swiftui: 9
https://www.hackingwithswift.com/100/swiftui/9
swift에서 이름이 없는 함수, 간단한 함수를 만들 수 있다. 이를 closure라고 하고 작성하는 방법은 {}
안에 매개변수, 리턴 타입, 함수 내용을 작성하면 된다.
let sayHello = {
print("Hello!")
}
sayHello()
{}
중간에 엔터를 입력하고 그곳에 함수 명령을 작성하면 된다. 그리고 그 함수를 실행할 때는 함수가 할당된 변수나 상수에 ()
를 붙여 실행하면 된다.let sayName = { (name: String) -> String in
"Hello, \(name)"
}
print(sayName("sweet little kitty"))
{}
안 첫번째 줄에 (매개변수: 매개변수 타입) -> 반환 값 타입 in
을 작성해야 한다. 그리고 함수 명령을 작성하여 지정한 타입대로 값을 반환하게 하면 된다. 다만 함수를 실행할 때는 일반 함수와 달리 인자의 이름을 작성하지 않는다(sayName(name: "sweet little kitty")
가 아니다).❗️closure는 external parameter name을 사용할 수 없다.
let greeting: () -> Void = sayHello
greeting()
()
안에 매개변수들을, ->
다음에 리턴 타입을 작성하면 된다. 만약 리턴하지 않는 함수라면 Void
를 입력하면 된다.예: sorted 메소드에 내가 지정한 함수를 인자로 전달하기
let captainFirstTeam = team.sorted(by: { (name1: String, name2: String) -> Bool in
if name1 == "Suzanne" {
return true
} else if name2 == "Suzanne" {
return false
}
return name1 < name2
})
코드 파일
https://github.com/soaringwave/Ios-studying/commit/da6bf1240a42a0df11e4add2703cd518d8324656
closure는 더 줄일 수 있다.
let team = ["Gloria", "Suzanne", "Piper", "Tiffany", "Tasha"]
let captainFirstTeam = team.sorted(by: { (name1: String, name2: String) -> Bool in
if name1 == "Suzanne" {
return true
} else if name2 == "Suzanne" {
return false
}
return name1 < name2
})
print(captainFirstTeam)
위 코드를 예로 들면, 매개변수 타입과 리턴 타입은 String과 Bool로 정해져 있다. 그래서 이를 생략하고 아래 코드로 줄일 수 있다.
let captainFirstTeam = team.sorted { name1, name2 in
if name1 == "Suzanne" {
return true
} else if name2 == "Suzanne" {
return false
}
return name1 < name2
}
또 이 코드를 매개변수 이름이 아닌 인덱스로 대체해서 아래로 줄일 수 있다.
let captainFirstTeam = team.sorted {
if $0 == "Suzanne" {
return true
} else if $1 == "Suzanne" {
return false
}
return $0 < $1
}
다른 예시:
let tOnly = team.filter { $0.hasPrefix("T") }
print(tOnly)
let uppercaseTeam = team.map { $0.uppercased() }
print(uppercaseTeam)
결과:
["Tiffany", "Tasha"]
["GLORIA", "SUZANNE", "PIPER", "TIFFANY", "TASHA"]
코드 파일
https://github.com/soaringwave/Ios-studying/commit/73ca2d729c1ac17732f7b0a857e9999135f3ca6e
코드가 간결해지는 장점은 있으나 함수 명령이 길 때, 매개변수가 자주 활용될 때, 매개변수가 많을 때는 이를 삼가는 게 낫다.
함수를 매개변수로써 전달할 수 있다.
예시:
let swanDive = {
print("SWAN DIVE!")
}
func performDive(type dive: () -> Void) {
print("I'm climbing up to the top")
dive()
}
performDive(type: swanDive)
func repeatAction(count: Int, action: () -> Void) {
for _ in 0..<count {
action()
}
}
repeatAction(count: 5) {
print("Hello, world!")
}
func goCamping(then action: () -> Void) {
print("We're going camping!")
action()
}
goCamping {
print("Sing songs")
print("Put up tent")
print("Attempt to sleep")
}
func goOnVacation(to destination: String, _ activities: () -> Void) {
print("Packing bags...")
print("Getting on plane to \(destination)...")
activities()
print("Time to go home!")
}
goOnVacation(to: "Mexico") {
print("Go sightseeing")
print("Relax in sun")
print("Go hiking")
}
위처럼 전달하려는 함수의 타입을 매개변수 이름 옆에 설정하고, 함수를 실행할 때 이미 있는 함수를 전달하거나(첫 번째 예시) {}
안에 함수를 설정(두 번째 예시)하면 된다.
❗️ 매개변수가 여러 개일 때는 함수가 가장 마지막 순서여야 한다.
https://www.hackingwithswift.com/quick-start/beginners/how-to-accept-functions-as-parameters