swift 문법 총정리(6) Closure

Updated:

Closure

//func
func sayHi() -> String {
	return "Hello"
}
//closure
var sayGreet = { () -> String in 
	return "Hello"
	}

sayGreet()

//func
func sayHi(name: String) -> String{
	return "\(name) Hello1"
}

sayHi(name: "jin")
//"jin Hello1"

//closure
var sayGreet = { (name: String) -> String in
	return "\(name) Hello2"
}

sayGreet("jin")
//파라미터 이름을 쓸 필요가 없다.


//type inference(타입 추론) return type을 예상한다.
var sayGreet2 = { (fistName: String, lastName: String) in
	return "\(firstName + lastName) Hello2"
}



// implicit Returns from Single-express closure(암시적 리턴(변환) - 한줄일때만)
var sayGreet3: (String, String) -> String = { (firstName, lastName) in 
	"\(firstName + lastName) Hello2"

}

//Shortand Arguments Names(인자 이름 축약)
var sayGreet4: (String, String) -> String = { $0 + $1 }
sayGreet4("j","h"
//"jh"

  1. return type을 적지 않아도 됟나.
  2. 암시적 생략 : return 키워드도 지울 수 있다. (단, 로직이 한줄만 존재할 경우, 바로 다음값이 리턴임을 알 수 있다.)

Closure Expert

var names = ["apple", "lemon", "brown", "red", "band", "candy"]

// filter a로 시작, b로 시작

//func
func fileString(dates: [String], firstString: String) -> [String]{
	var newDatas = [String]()
	for index in 0..<datas.count{
		if datas[index].first?.description == firstString{
			newDatas.append(datas[index])
		}
	}
	return newDatas
}

filterStrings(datas: names, firstString: "a")


//closure
func filterStringClosure(datas: [String], closure: (String) -> Bool ) -> [String]{
	var newDatas = [String]()
	for data in datas{
		if closure(data) == true {
			newDatas.append(data
		}
	}
	return newDatas
}

let filtered = filterStringClosure(datas: names) { (element) -> Bool in
	if element.first?.description == "a"{
		return true
	}
	return false
}

print(filtered)


//func으로 하면 훨씬 코드가 간결하지만 closure로 만드는 이유는 조건을 closure로 잡아두면 실행하는 순간에 조건을 확인하기가 편하다. 
//즉, func에서는 조건 변경시 수정이 아주 까다롭다.

var findA: (String) -> Bool = { element in
	if element.first?.description == "a" {
		return true
	}
	return false

}

var findB: (String) -> Bool = { element in
	if element.first?.description == "b" {
		return true
	}
	return false
}

filterStringClosure(datas: name, closure: findA)
filterStringClosure(datas: name, closure: findB)
//조건을 이런식으로 선언해두면 변형해주기가 아주 쉽다.

//이런식으로
var stringLength5: (String) -> Bool = {element in
	if element.count == 5 {
		return true
	}
	return false
}


filterStringClosure(datas: name, closure: stringLength5)

//엄청 편한 방법이고, 읽기도 쉬워지고 오류 수정도 쉬워진다. 깔끔한 로직을 위해서는 필요하다.

Closure + func

이렇게 사용하는 경우가 대부분이다.

func greeting(name: String) -> String{
	return "hi" + name
}
greeting(name: "jin")


func greetingClosure(name: String) -> () -> String{
	return {"h1" + name}
}

greetingClosure(name: "minho")()
//괄호를 뒤에 붙이는 이유는 : function뒷부분과 closure가 정의해주는게 똑같다. 
//closure와 함수와 다른점은 이름이 없고type 설정만 해주는 것이다. 
//함수도 실행을 위해서는 뒤에 ()를 붙여준다. 같은원리로 closure도 실행을 하기위해서는 ()를 붙인다고 보면 된다. 
//function의 구조를 그대로 가져다 사용한다. 
//원래 마지막도 return { return "h1" + name } 인데 생략해 준 것이다.

Reference

인프런 강의

Tags: ,

Categories:

Updated:

Leave a comment