스위프트 투어 - 함수와 클로져 Swift


함수와 클로져

func 를 사용해 함수를 만든다. 괄호내에 매개변수의 리스트를 가진 이름에 의해 함수를 호출한다. -> 를 통해 파라미터 이름과 형식을 구별한다.

func greet(person:String, day:String) -> String {
  return "Hello \(person), today is \(day)."
}
greet(person:"Bob", day:"Tuesday")

기본적으로 함수는 이들 파라미터의 이름을 이들 매개변수의 레이블로 사용한다. 파라미터 이름전에 사용자 매개변수 라벨을 작성하거나 매개변수 레이블을 사용하지 않으려면 _를 사용한다.

func greet(_ person: String, on day:String) -> String {
  return "Hello \(person), today is \(day)."
}
greet("John", on:"Wednesday")

튜플을 사용하여 복합 값을 생성한다. 예를들어, 함수로 부터 다중 값을 반환할 때가 있다. 튜플의 요소는 이름이나 숫자로 참조될 수 있다.

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 < max) {
      min = score
    }
    sum += score
  }
  return (min, max, sum)
}

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

함수는 네스트될 수 있다. 네스트된 함수는 외부 함수에서 정의된 변수로 접근할 수 있다. 네스트된 함수를 사용해 길거나 복잡한 함수를 조직화할 수 있다.

func returnFifteen() -> Int {
  var y = 10
  func add() {
    y+=5
  }
  add()
  return y
}
returnFifteen()

함수는 첫 번째 클래스 형식이다. 이 뜻은 함수는 다른 함수로 값으로 전달 될 수 있다.

func makeIncrementer() -> ((Int) -> (Int) {
  func addOne(number:Int) -> Int {
    return 1+number
  }
  return addOne
}
var increment = makeIncrement()
increment(7)

함수는 아규먼트로 다른 함수를 받아들일 수 있다.

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)

함수는 실제로는 클로저의 특별한 상황이며 코드 블럭을 이후에 호출할 수 있다. 클로저의 코드는 클로저가 생성된 범위에서의 변수와 함수와 같은 것들에 대한 접근을 가지는데 클로저가 실행되는 곳이 다르더라도 실행할 수 있다. 네스트 함수에서 이미 예시를 보았다. 이름없이 {} 를 통해 생성할 수 있다. in 을 사용해 매개변수와 반환값을 바디로부터 분리할 수 있다.

numbers.map({(number: Int) -> Int in 
  let result = 3*number
  return result
})

더 명확하게 클로저를 작성하는 몇가지의 선택사항이 있다. 클로저의 형식이 델리게이트를 위한 콜백과 같이 이미 알려진 것이면 이 파라미터의 형식, 반환값 또는 양쪽의 형식을 생략할 수 있다. 단일 문장의 클로져는 이 문장의 값을 내포적으로 반환한다.

let mappedNumbers = numbers.map({number in 3 * number})
print(mappedNumbers)

파라미터를 이름이 아닌 숫자로 참조할 수 있다. 이 접근은 특히 짧은 클로저에 유용하다. 클로저를 마지막 매개변수로 함수에 전달한 것을 괄호 뒤에서 즉시 보여지게 할 수 있다. 클로저가 함수의 유일한 매개변수면 괄호를 완전히 생략할 수 있다.

let sortedNumbers = numbers.sorted{ $0 > $1 }
print(sortedNumbers)

덧글

댓글 입력 영역