DEV_Larva

ν΄λ‘œμ € & ν›„ν–‰ ν΄λ‘œμ € λ³Έλ¬Έ

iOS/Swift 문법

ν΄λ‘œμ € & ν›„ν–‰ ν΄λ‘œμ €

NelchuPapa 2022. 8. 8. 15:55
λ°˜μ‘ν˜•

πŸ§‘‍πŸ’»μ΄λ²ˆ Swift μ‹œκ°„μ— λ°°μ›Œλ³Ό 것은  λ‹€μŒκ³Ό κ°™λ‹€. πŸ‘¨πŸ»‍πŸ’»

 

  • ν΄λ‘œμ €λ₯Ό λ§Œλ“€κ³  μ‚¬μš©ν•˜λŠ” 방법 
  • ν›„ν–‰ ν΄λ‘œμ € 및 단좕 ꡬ문을 μ‚¬μš©ν•˜λŠ” 방법
  • ν•¨μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ λ°›μ•„ λ“€μ΄λŠ” 방법

 

 


1. ν΄λ‘œμ €κ°€ λ¬΄μ—‡μΈκ°€μš”?πŸ€”

 

 

일단 ν΄λ‘œμ €μ— λŒ€ν•΄μ„œ κ°„λ‹¨ν•˜κ²Œ μ–ΈκΈ‰ν•˜μžλ©΄ Swiftμ—μ„œ μš°λ¦¬κ°€ 원할 λ•Œλ§ˆλ‹€ 전달할 수 있고 ν˜ΈμΆœν•  수 μžˆλŠ” μ½”λ“œ 덩어리λ₯Ό λ§ν•œλ‹€. 

이 ν•¨μˆ˜λŠ” 이름이 μ—†μ§€λ§Œ, κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ 사싀상 λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  값을 λ°˜ν™˜ ν•˜μ§€ μ•ŠλŠ” ν•¨μˆ˜μ΄λ‹€. 

ν΄λ‘œμ €λŠ” μ€‘κ΄„ν˜Έλ‘œ μ‹œμž‘ν•˜κ³  λλ‚˜κ²Œ λ˜λŠ”λ° μ΄λŠ” λ‹€λ₯Έλ§λ‘œ λ§€κ°œλ³€μˆ˜λ‚˜ λ°˜ν™˜ 값을 μ œμ–΄ν•˜κΈ° μœ„ν•΄ μ€‘κ΄„ν˜Έ 외뢀에 μ½”λ“œλ₯Ό 넣을 수 μ—†λ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€. 

 

일단 ν•™μŠ΅μ„ ν•˜λŠ” 과정에도 κ·Έλ ‡κ³  정리λ₯Ό ν•˜λŠ” 쀑에도 μ •ν™•νžˆ 100%이해 ν–ˆλ‹€κ³  ν•˜κΈ°μ—λŠ” 무리가 μžˆλŠ” λΆ€λΆ„μ΄μ—ˆλ‹€. 

κ·Έλž˜μ„œ μ΄λ²ˆμ—λŠ” The Swift Language Guide 의 곡식 λ¬Έμ„œλ‘œ 도움을 많이 λ°›μ•„ λ³΄μ•˜λ‹€. 

κ³΅μ‹λ¬Έμ„œλ₯Ό 톡해 기본적인 ν΄λ‘œμ €μ— λŒ€ν•΄ ν•™μŠ΅μ„ ν•˜κ³  본둠으둜 λ„˜μ–΄κ°€λ³΄μž! 

 

https://jusung.gitbook.io/the-swift-language-guide/language-guide/07-closures

 

Closures — The Swift Programming Language (Swift 5.7)

Closures Closures are self-contained blocks of functionality that can be passed around and used in your code. Closures in Swift are similar to blocks in C and Objective-C and to lambdas in other programming languages. Closures can capture and store referen

docs.swift.org

 

ν•΄λ‹Ή λ¬Έμ„œμ—μ„œλŠ” μ „μ—­ν•¨μˆ˜, 쀑첩 ν•¨μˆ˜, ν΄λ‘œμ € ν‘œν˜„μ‹μ˜ μ •μ˜μ— λŒ€ν•œ 비ꡐλ₯Ό 톡해 λ¨Όμ € μ΄ν•΄ν•˜κΈ°λ³΄λ‹€ νŽΈν–ˆλ‹€. 

 

  • μ „μ—­ ν•¨μˆ˜ : 이름이 있고 값을 μΊ‘μ²˜ν•˜μ§€ μ•ŠλŠ” ν΄λ‘œμ €.
  • 쀑첩 ν•¨μˆ˜ : 이름이 있고 λ‘˜λŸ¬μ‹ΈλŠ” ν•¨μˆ˜μ—μ„œ 값을 μΊ‘μ²˜ν•  수 μžˆλŠ” ν΄λ‘œμ €.
  • ν΄λ‘œμ € ν‘œν˜„μ‹ : μ£Όλ³€ μ»¨ν…μŠ€νŠΈμ—μ„œ 값을 μΊ‘μ²˜ν•  수 μžˆλŠ” κ°„λ‹¨ν•œ ꡬ문으둜 μž‘μ„±λœ 이름 μ—†λŠ” ν΄λ‘œμ €.

 

 

ν΄λ‘œμ € ν‘œν˜„μ‹ ꡬ문의 일반적인 ν˜•μ‹μ€ λ‹€μŒκ³Ό κ°™λ‹€.  

 

 


 

 

2. ν΄λ‘œμ € 생성 및 μ‚¬μš©λ²• 

 

이제 κ°„λ‹¨ν•œ 예제λ₯Ό 톡해 ν΄λ‘œμ €μ— μ ‘κ·Όν•΄λ³΄μž 

 

let sayHello = { (name: String) -> String in
    "Hi \(name)!"
}

 

μ—¬κΈ°μ„œ μš°λ¦¬λŠ” inμ΄λΌλŠ” ν‚€μ›Œλ“œκ°€ 보인닀. ν΄λ‘œμ €μ˜ λ§€κ°œλ³€μˆ˜μ™€ λ°˜ν™˜ μœ ν˜• λ°”λ‘œ 뒀에 였고 μžˆλŠ” 것을 확인할 수 μžˆλ‹€. 일반 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ λ§€κ°œλ³€μˆ˜μ™€ λ°˜ν™˜ μœ ν˜•μ΄ μ€‘κ΄„ν˜Έ 외뢀에 μ‘΄μž¬ν–ˆμ§€λ§Œ ν΄λ‘œμ €μ—μ„œλŠ” μ•žμ„œ λ§ν–ˆλ“― κ·Έλ ‡κ²Œ ν•  μˆ˜μ—†λ‹€. 

 

 

λ‹€λ₯Έ μ½”λ“œλ₯Ό ν•œλ²ˆ 보자

func getUserData(for id: Int) -> String {
    if id == 1989 {
        return "Taylor Swift"
    } else {
        return "Anonymous"
    }
}

let data: (Int) -> String = getUserData
let user = data(1989)
print(user)

ν•¨μˆ˜ getUserDataλŠ” μ •μˆ˜λ₯Ό λ°›μ•„λ“€μ—¬μ„œ λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. 그런데 ν•¨μˆ˜μ˜ 볡사본을 λ§Œλ“€ λ•Œ ν•¨μˆ˜μ˜ μœ ν˜•μ€ μ™ΈλΆ€ 맀개 λ³€μˆ˜ 이름에 λŒ€ν•œ forλ₯Ό ν¬ν•¨ν•˜κ³  μžˆμ§€ μ•Šλ‹€. λ”°λΌμ„œ 볡사본인 호좜될 λ•Œ data(for:1989)κ°€ μ•„λ‹ˆλΌ data(1989)λ₯Ό μ‚¬μš©ν•œλ‹€. 

 

이 μ˜ˆμ œμ—μ„œλŠ” λ™μΌν•œ κ·œμΉ™μœΌλ‘œ λͺ¨λ“  ν΄λ‘œμ €μ— μ μš©λœλ‹€. μ•žμ„œ 처음 λ‚˜μ™”λ˜ 예제의 sayHelloλ₯Ό μ—¬κΈ°μ„œ λ‹€μ‹œ ν•œλ²ˆ 호좜 해보면 ν•¨μˆ˜λ₯Ό 볡사할 λ•Œμ™€ 같이 λ§€κ°œλ³€μˆ˜ 이름을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€. μ™œ?? μ™ΈλΆ€  λ§€κ°œλ³€μˆ˜ 이름은 ν•¨μˆ˜λ₯Ό 직접 ν˜ΈμΆœν•  λ•Œμ—λ§Œ μ€‘μš”ν•˜μ§€ ν΄λ‘œμ €λ₯Ό μƒμ„±ν•˜κ±°λ‚˜ ν•¨μˆ˜μ˜ 볡사본을 λ¨Όμ € κ°€μ Έμ˜¬ λ•Œκ°€ μ•„λ‹Œ 것이기 λ•Œλ¬Έμ΄λ‹€.

 

 


3. ν›„ν–‰ ν΄λ‘œμ € μ‚¬μš©ν•˜λŠ” 방법 

 

λ§Œμ•½ ν•¨μˆ˜μ˜ λ§ˆμ§€λ§‰ μΈμžκ°€ μ½œλ‘œμ €κ°€ λ“€μ–΄κ°€ 있고 ν•΄λ‹Ή ν΄λ‘œμ €κ°€ κΈΈμ–΄μ§€κ²Œ λœλ‹€λ©΄ ν›„ν–‰ ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

 

 
func someFunctionThatTakesAClosure(closure: () -> Void) {
    // function body goes here
}

 

ν΄λ‘œμ €μ˜ 인자 κ°’ λΆ€λΆ„κ³Ό λ°˜ν™˜ ν˜• 뢀뢄을 μƒλž΅ν•˜κ±°λ‚˜ 

someFunctionThatTakesAClosure(closure: {
    // closure's body goes here
})

λ‹€μŒκ³Ό 같이 ν‘œν˜„ν•΄λ³Ό 수 μžˆλ‹€. 

 

사싀은 ν•¨μˆ˜λ₯Ό λŒ€κ΄„ν˜Έ () {}둜 λ¬ΆλŠ” 것, 일반적인 μ „μ—­ ν•¨μˆ˜ ν˜•νƒœκ°€ 사싀은 ν΄λ‘œμ € ν˜•νƒœλ₯Ό 이미 μ‚¬μš©ν•˜κ³  μžˆμ—ˆλ˜ 것인데,

μœ„μ—μ„œ μ–ΈκΈ‰ν•˜μ˜€λ˜ 예제λ₯Ό λ°”λ‘œ ν›„ν–‰ ν΄λ‘œμ €λ₯Ό μ΄μš©ν•΄ ν‘œν˜„ν•΄λ³΄λ©΄ λ‹€μŒκ³Ό κ°™λ‹€. 

someFunctionThatTakesAClosure() {
    // trailing closure's body goes here
}

 

 

 


 

4. ν•¨μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ λ°›μ•„λ“€μ΄λŠ” 방법 

 

이 νŒŒνŠΈλŠ” μ•žμ—μ„œ 배운 ν›„ν–‰ ν΄λ‘œμ € 파트 λ•Œλ¬Έμ— 특히 μ€‘μš”ν–ˆλ˜ 기술둜 κ°€μ§€κ³  μžˆλ‹€λ©΄ μΆ©λΆ„νžˆ μœ μš©ν•˜κΈ° λ•Œλ¬Έμ— ν•œλ²ˆ λ°°μ›Œλ³΄μž!

 

func makeArray(size: Int, using generator: () -> Int) -> [Int] {
    var numbers = [Int]()

    for _ in 0..<size {
        let newNumber = generator()
        numbers.append(newNumber)
    }

    return numbers
}

λ‹€μŒ μ˜ˆμ œλŠ” ν•¨μˆ˜λ₯Ό μ›ν•˜λŠ” νŠΉμ • 횟수만큼 λ°˜λ³΅ν•΄ μ •μˆ˜ 배열을 생성 ν•¨μˆ˜λ‘œ μžμ„Ένžˆ ν•œ 쀄씩 λœ―μ–΄λ³΄λ©΄,

 

  1. ν•¨μˆ˜ makeArray()λŠ” 두 개의 맀개 λ³€μˆ˜κ°€ ν•„μš”ν•œλ°, 그쀑 ν•˜λ‚˜λŠ” μš°λ¦¬κ°€ μ›ν•˜λŠ” μ •μˆ˜μ˜ 개수이고 μ •μˆ˜ 배열을 λ°˜ν™˜ν•œλ‹€. 
  2. 두 번째 맀개 λ³€μˆ˜λŠ” ν•¨μˆ˜μ΄λ‹€. 맀개 λ³€μˆ˜ 자체λ₯Ό ν—ˆμš©ν•˜μ§€ μ•Šμ§€λ§Œ 호좜될 λ•Œλ§ˆλ‹€ ν•˜λ‚˜μ˜ μ •μˆ˜λ₯Ό λ°˜ν™˜ν•œλ‹€.
  3. makeArray() λ‚΄λΆ€μ—μ„œλŠ” 빈 μ •μˆ˜ 배열을 μƒˆλ‘œ ν•˜λ‚˜ λ§Œλ“  λ‹€μŒ μ‚¬μš©μžκ°€ μš”μ²­ν•œ 횟수만큼 λ°˜λ³΅ν•œλ‹€. 
  4. λ°˜λ³΅μ„ ν•  λ•Œλ§ˆλ‹€ μš°λ¦¬λŠ” νŒŒλΌλ―Έν„°λ‘œ μ „λ‹¬λœ generater() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€. 이게 ν•˜λ‚˜μ˜ μƒˆλ‘œμš΄ μ •μˆ˜λ₯Ό λ°˜ν™˜ν•˜κ²Œ λœλ‹€. 

 

 

let rolls = makeArray(size: 50) {
    Int.random(in: 1...20)
}

print(rolls)

κ²°κ³Όλ‘œλŠ” 이제 숫자λ₯Ό μƒμ„±ν•˜λŠ” 데 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” ν•¨μˆ˜λ₯Ό μ „λ‹¬ν•΄μ„œ μž„μ˜μ˜ 크기의 μ •μˆ˜ 배열을 λ§Œλ“€ 수 μžˆλ‹€λŠ” κ±°λ‹€. 

 

 


learning by repetition

 

Swiftλ₯Ό λ°°μš°λŠ” κ³Όμ • 쀑에 ν΄λ‘œμ € 뢀뢄이 κ°€μž₯ μ–΄λ ΅λ‹€κ³ λ“€ ν•˜λŠ”λ° ν™•μ‹€νžˆ λ§žλŠ” 것 κ°™λ‹€...

λ°˜μ‘ν˜•

'iOS > Swift 문법' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

μ•‘μ„ΈμŠ€ μ œμ–΄ & λ©”μ„œλ“œ  (0) 2022.08.16
ꡬ쑰체  (0) 2022.08.14
λ§€κ°œλ³€μˆ˜  (0) 2022.07.24
ν•¨μˆ˜  (0) 2022.07.23
반볡문  (0) 2022.07.15