Day7

희희희·2021년 9월 23일

Using closures as parameters when they accept parameters

closure를 parameter로도 쓸 수 있음.

func travel(action: (String) -> Void) {
    print("I'm getting ready to go.")
    action("London")
    print("I arrived")
}
travel { (place: String) in
    print("I'm going to \(place) in my car")
}

Using closures as parameters when they return values

()->Void에서 Void가 아닌 반환하고싶은 다른 어떤 형태의 데이터 타입으로 바꿔도 됨..
위의 함수에서 약간의 변형을 줘서 string 값을 반환하고싶다면 아래처럼 써주면 됨.

func travel (action: (String) -> String ) {
	print(“I’m getting ready to go.”)
	let description = action(“London”)
	print(description)
	print(“I arrived”)
}
travel { (place: String) -> String in 
	return “I’m going to \(place) in my car”
}

Shorthand parameter names

위 코드에서 travel을 부를 때 swift는 parameter의 데이터 타입을 알고있다. 따라서 아래처럼 쓸 수 있음.

travel { place -> String in 
	return “I’m going to \(place) in my car”
}

또한 swift는 반환할 데이터 타입도 알고있으며, 코드가 한 줄 이라면 그 코드가 반환할 코드인 것을 알고있음. 따라서 아래처럼 더 줄일 수 있음.

travel { place in 
	“I’m going to \(place) in my car”
}

또한 swift는 자동적으로 closure의 parameter 이름을 ‘$’을 이용해 제공해줌. 아래의 코드는 위와 같은 코드임.

travel { 
	“I’m going to \($0) in my car”
}

Closures with multiple parameters

두 가지 parameter를 받을 때도 위와 동일. $을 이용하여 closure를 작성하는 경우에 앞의 parameter를 $0으로, 뒤의 parameter를 $1을 이용해 작성.

func travel (action: (String, Int) -> String ) {	
	print(“I’m getting ready to go.”)
	let description = action(“London”, 60)
	print(description)
	print(“I arrived”)
}


travel {
	“I’m going to \($0) at \($1)miles per hour”
}

Returning closures from functions

return 하는 값을 closure로 줄 수도 있음.

func travel() -> (String) -> Void {	return
	{	
    		print(“I’m going to \($0).”)
	}
}
let result = travel()
result(“London”)

이때

let result = travel()(“London”)

으로 작성해도되지만 되도록이면 안쓰도록 해야함.

Capturing values

closure안에 값을 선언해서 쓰게되면 이후에 그 값이 필요없어져도 swift가 그 값을 capture하여 안에 남아있음.

func travel() -> (String) -> Void {
	var counter = 1
    	return {
        	print(“\(counter). I’m going to \($0).”)
		counter += 1
		}
}
let result = travel()
result(“London”)
result(“London”)

위 처럼 result를 반복하게되면 counter의 값이 계속 늘어남.


HackingWithSwift_Day7

profile
iOS 어플 개발 연습

0개의 댓글