idghst.dev
article thumbnail
Published 2023. 1. 27. 09:00
[ Swift ] 함수와 클로저 Swift
728x90
반응형

함수

  • 함수는 func 키워드를 사용해서 선언합니다
  • () 안에 인자를 받을 수 있게 만들 수 있습니다
  • 반환되는 값이 있는 경우, -> 을 이용해서 반환 타입을 선언합니다.
func printGugu(dan: Int) {
    for i in 1...9 {
        print("\(dan) * \(i) = \(dan * i)")
    }
}

printGugu(dan: 5)
// printGugu(5) // 인자는 반드시 특정해야 함
//    5 * 1 = 5
//    5 * 2 = 10
//    5 * 3 = 15
//    5 * 4 = 20
//    5 * 5 = 25
//    5 * 6 = 30
//    5 * 7 = 35
//    5 * 8 = 40
//    5 * 9 = 45
func rollDice() -> Int {
    return Int.random(in: 1...6)
}

let random = rollDice()

 

클로져

  • 클로저는 이름이 존재하지 않는 함수라고 생각하면 편합니다
  • 클로저는 함수와 마찬가지로 Variable 이나 Constant 에 할당할 수 있습니다
// 함수 
func call(name: String) {
    print("hello, \(name)")
}

call(name: "Jason") // 직접 정의한 함수는 인자명 명시
// hello, Jason
// 상수에 함수 할당하고, 해당 상수를 호출 해보기 
let callName = call
callName("Aha") // 상수에 할당한 함수는 인자명 명시 불가
// hello, Aha
// 상수에 클로저 할당하고, 해당 상수 호출 해보기 
let helloName = { (name: String) in
    print("hello, \(name)")
}
helloName("Oho") // 클로저도 인자명 명시 불가
// hello, Oho

 

  • 클로저 형식은 함수와 거의 동일합니다.
  • in 을 통해서 파라미터 및 반환 타입과 실제 클로저 코드를 분리합니다
// 클로져 형태
{ (name: String) -> Bool in  
   // some code
}

 

  • 클로저는 배열과 딕셔너리 같은 컬렉션 타입과 함께
    filter, map, reduce 메소드 사용 시 자주 활용됩니다
// filter
let members = ["Jason", "Greg", "Tiffany"]
let nameHasT = members.filter { name in
    return name.hasPrefix("T")
}
print(nameHasT)
// ["Tiffany"]
// map
let prices = [1000, 2000, 3000]
let doubledPrices = prices.map { price in
    return price * 2
}
print(doubledPrices)
// [2000, 4000, 6000]
// reduce // 요약의 의미 // 아래 코드는 for문과 동일하게 동작한다
let revenues = [100, 200, 300]
// 배열(딕셔너리).reduce(초기값){ 초기(반환)값, 배열(딕셔너리)의 다음값 
let totalRevenue = revenues.reduce(0) { partialResult, next in
    return partialResult + next
}
print(totalRevenue)
// 600

 

728x90
반응형

'Swift' 카테고리의 다른 글

[ Swift ] 프로토콜  (0) 2023.02.01
[ Swift ] 구조체와 클래스  (0) 2023.01.30
[ Swift ] 옵셔널  (0) 2023.01.25
[ Swift ] 반복문  (0) 2023.01.23
[ Swift ] 조건문  (0) 2023.01.20
profile

idghst.dev

@idghst.dev

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!