함수와 클로저

냐옹·2024년 7월 11일
0

IOS

목록 보기
7/32

본 작성글은 swift 공식 문서를 참고하였습니다.

함수와 클로저

  • 함수를 선언하려면 func를 사용한다.
  • 소괄호 안에 인수의 리스트와 함수의 이름으로 호출한다.
  • 함수의 반환타입에서 파라미터이름과 타입을 구분하기 위해 ->을 사용한다.
func greet(person : String, day : String) -> String {
	return "Hello \(person), today is \(day)."	
}

greet(person : "Bob", day : "Tuesday")

전달인자 레이블

  • 기본적으로 함수는 파라미터 이름을 인수의 라벨로 사용한다.
  • 파라미터 이름 전에 인수라벨을 작성하거나, 인수라벨을 사용하지 않으려면 _를 작성해야 한다.
// 이 경우는 전달인자 레이블과 받는 걸 일치시킨 경우이다. 
func greet1(to : String, from : String) -> String {
	return "\(from) => \(to)"
}


func greet2( receiver to : String, giver from : String ) -> String{
	return "\(to) -> \(from)"
}
// 전달인자로 receiver와 giver가 사용되었다.

func greet3( _ to : String, giver from :String ) -> String {
	return ("\(to) -> \(from)")
}


greet1(to : "받는 사람", from : "주는 사람")
greet2(receiver : "받는 사람", giver : "주는 사람")
greet3("받는 사람", giver : "주는 사람")

튜플을 사용하여 복합값 만들기

  • 튜플 tuple을 사용하여 복합 값을 만든다. 예를 들어서 함수로부터 여러개의 값을 반환할 때 사용한다.
  • 튜플의 요소는 이름 또는 번호로 참조할 수 있다.
func calculateStatistics(scores: [Int]) -> (min : Int, max : Int, sum : Int){
	var min = scores[0]
    var max = scores[0]
    var sum = 0
    
    for score in scores {
      if score > max {
      	max = score
      } else if score < min {
      	min = score
      }
      sum += score
    }
  	return (min, max, sum)
}

let statictics = calculateStatistics(scores : [5,3,100,3,9])
print(statistics.sum)
// 120
print(statistics.2)
// 120

함수의 중첩

  • 함수는 중첩될 수 있고, 중첩된 함수는 외부함수에서 선언한 변수에 접근할 수 있다.
func returnFifteen() -> Int{
	var y = 10
    fun add(){
    	y += 5
    }
  	add() 
  	return y
}
return Fifteen()
  • 함수는 1급타입이고, 이것은 함수가 다른 함수를 값으로 반환할 수 있다는 것이다.
func makeIncrementer() -> ((int) -> Int) {
	func addOne(number : Int) -> Int {
    	return 1 + number;
    }
  	return addOne;
}

var increment = makeIncrementer()
increment(7)
  • 함수는 다른 함수를 인수 argument 중 하나로 가질 수 있다.
func hasAnyMatches( list : [Int], condition : (Int) -> Bool )  -> Bool {
	for item in list {
    	if condition(item){
        	return true
        }
    }
  	return false
}

func lessThanTen(number : Int) -> Bool{
	return number < 10
}

var numbers = [20, 19, 7, 12]

hasAnyMatches( list : numbers, condition : lessThanTen )
  • 함수는 나중에 호출될 수 잇는 코드 블럭인 클로저의 특별한 케이스이다.(named closure ) 클로저에 있는 코드는 이미 중첩된 함수의 예제에서 보았듯이 클로저가 실행될 때 다른 범위에 있더라도, 클로저가 생성된 범위에서 사용가능한 변수와 함수와 같은 항목에 접근할 수 있다.
  • 중괄호 {}로 코드를 묶어 이름 없이 클로저를 작성할 수 있다. 본문으로부터 인수와 반환타입을 분리하기 위해서 in을 사용한다.
let numbers : [Int] = [1,2,3,4,5]

let result : [String] = numbers.map({
  (number : Int) -> String in 
  print(number)
  return String(number)
})
  • 더 간단하게 클로저를 작성하기 위해 몇가지 선택사항이 있다.
  • 대리자 delegate에 대한 콜백과 같이 클로저의 타입을 이미 알고 있다면 파라미터의 타입, 반환 타입 또는 둘 다 생략 가능하다.
  • 단일 클로저 구문은 암시적으로 구문의 만 반환한다.
let numbers : [Int] = [1,2,3,4,5]

let mappedNumbers = numbers.map({
	number in 3*number
})
print(mappedNumbers)
// [1,2,3,4,5]
  • 매우 짧은 클로저에 유용한 접근 방법으로 이름 대신 숫자로 파라미터를 참조할 수 있다.
  • 함수의 마지막 인수로 전달된 클로저는 소괄호 뒤에 바로 나타날 수 있다.
  • 클로저가 함수의 유일한 인수일 때 소괄호는 생략할 수 있다.
let numbers : [Int] = [3,1,4,2,5]

let sortedNumbers = numbers.sorted(){ $0 > $1 }
// sorted 뒤의 ()는 생략 가능하다.

print(sortedNumbers)
// [5,4,3,2,1]

0개의 댓글