[Swift 문법] 08. Swift ν•¨μˆ˜ 기초 νŒŒκ³ λ“€κΈ° 2 : μ€‘μ²©ν•¨μˆ˜, μ’…λ£Œλ˜μ§€ μ•ŠλŠ” ν•¨μˆ˜

2021. 1. 12. 12:10γ†πŸ§‘πŸ»‍πŸ’» iOS 개발/Swift

ν•΄λ‹Ή 글은 μ•Όκ³°λ‹˜μ˜ μŠ€μœ„ν”„νŠΈ κ°•μ˜μ™€ 개인적인 곡뢀λ₯Ό μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€.


μ €λ²ˆ ν¬μŠ€νŒ…μ— μ΄μ–΄μ„œ μ€‘μ²©ν•¨μˆ˜μ™€ μ’…λ£Œλ˜μ§€ μ•ŠλŠ” ν•¨μˆ˜, λ°˜ν™˜ κ°’ λ¬΄μ‹œ ν•¨μˆ˜μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

1. 쀑첩 ν•¨μˆ˜ 

기쑴의 C, C++μ—μ„œλŠ” ν•¨μˆ˜μ•ˆμ—μ„œ λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 것이 μΌλ°˜μ μ΄μ—ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ Swiftμ—μ„œλŠ” ν•¨μˆ˜ μ•ˆμ— ν•¨μˆ˜λ₯Ό λ„£μ–΄ κ΅¬ν˜„μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Swiftμ—μ„œ νŠΉλ³„ν•œ μœ„μΉ˜μ— 속해 μžˆμ§€ μ•ŠλŠ” ν•œ λͺ¨λ‘ μ „μ—­ ν•¨μˆ˜μΈλ° λΉ„ν•΄ ν•¨μˆ˜ μ•ˆμ— κ΅¬ν˜„λœ μ€‘μ²©ν•¨μˆ˜λŠ” ν•¨μˆ˜ μ•ˆμ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€ (λ°˜ν™˜ν•˜λ©΄ λ°–μ—μ„œλ„ μ‚¬μš© κ°€λŠ₯). 특히 μ „μ—­ν•¨μˆ˜κ°€ λ§Žμ€ ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” μ€‘μ²©ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜λ©΄ ν•¨μˆ˜ μ‚¬μš©λ²”μœ„λ₯Ό μ’€ 더 λͺ…ν™•ν•˜κ²Œ ν‘œν˜„ν•΄μ€„ 수 μžˆλŠ” μž₯점을 κ°€μ§‘λ‹ˆλ‹€.

1. 1. 쀑첩 ν•¨μˆ˜ 예제

// 쀑첩 ν•¨μˆ˜

typealias UpDownFunc = (Int) -> Int			// νƒ€μž… 별칭

func funcForMove(shouldGoUP: Bool) -> UpDownFunc {	// λ°˜ν™˜ νƒ€μž…μ΄ ν•¨μˆ˜
    
    func goUp(currentFloor: Int) -> Int {
        return currentFloor + 1
    }
    
    func goDown(currentFloor: Int) -> Int {
        return currentFloor - 1
    }
    
    return shouldGoUP ? goUp : goDown
}

var currentFloor: Int = 10

var targetFloor: Int = 6

let moveToTarget: UpDownFunc = funcForMove(shouldGoUP: currentFloor<targetFloor)

while currentFloor != targetFloor {
    print("ν˜„μž¬ \(currentFloor) μΈ΅...")
    currentFloor = moveToTarget(currentFloor)
}

print("띡! \(currentFloor)μΈ΅ 도착.")


2. μ’…λ£Œλ˜μ§€ μ•ŠλŠ” ν•¨μˆ˜ (Nonreturning function)

μ’…λ£Œλ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것은 return λ˜μ§€μ•Šκ³  λΉ„μ •μƒμ μœΌλ‘œ λλ‚˜λŠ” ν•¨μˆ˜λ₯Ό λœ»ν•©λ‹ˆλ‹€. 즉 이 λΉ„λ°˜ν™˜ ν•¨μˆ˜λŠ” 였λ₯˜λ₯Ό λ˜μ§€κ³  μ€‘λŒ€ν•œ μ‹œμŠ€ν…œ 였λ₯˜λ₯Ό λ³΄κ³ ν•œ ν›„ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ’…λ£Œν•˜κΈ° μœ„ν•΄μ„œ μƒκ²¨λ‚¬μŠ΅λ‹ˆλ‹€. λΉ„λ°˜ν™˜ ν•¨μˆ˜λŠ” μ–΄λ””μ„œλ“  호좜이 κ°€λŠ₯ν•˜κ³  λ°˜ν™˜νƒ€μž…μ„ Never둜 λͺ…μ‹œν•˜μ—¬ μ •μ˜ν•©λ‹ˆλ‹€.

func myHairFallsOut() -> Never {
    fatalError("Something very, very bad happened")
}

func goodMorning(isAllIsWell: Bool) -> Void {

    guard isAllIsWell else {    
        print("OMG!")
        myHairFallsOut()
    }
    
    print("All is well!")
    
}

goodMorning(isAllIsWell: true)	//All is well!
goodMorning(isAllIsWell: false)	//OMG!   ν”„λ‘œμ„ΈμŠ€ μ’…λ£Œ ν›„ 였λ₯˜ 보고 

guard ꡬ문은 ifλ¬Έκ³Ό μœ μ‚¬ν•˜μ§€λ§Œ 살짝 λ‹€λ¦…λ‹ˆλ‹€. μΆ”ν›„ ν¬μŠ€νŒ…μ—μ„œ λΉ λ₯Έ μ’…λ£Œλ₯Ό μœ„ν•œ guard문에 λŒ€ν•΄μ„œ λ‹€λ£¨κ² μŠ΅λ‹ˆλ‹€.


3. λ°˜ν™˜ 값을 λ¬΄μ‹œν•  수 μžˆλŠ” ν•¨μˆ˜ ( @discardableResult 속성 )

λ•Œλ‘œλŠ” μ˜λ„μ μœΌλ‘œ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ λ°˜ν™˜κ°’μ„ ν•„μš”ν•˜μ§€ μ•Šμ„ λ•Œ μ»΄νŒŒμΌλŸ¬μ—κ²Œ 미리 μ•Œλ €μ€˜μ„œ κ²½κ³ λ₯Ό 받지 μ•Šκ²Œλ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. ν•¨μˆ˜ μ„ μ–Έ μ•žμ— @discardableResult 속성을 적어 μ„ μ–Έν•©λ‹ˆλ‹€. 

@discardableResult func saySomething(something: String) -> String {
    print(something)
    return something
}

saySomething(something: "Mu Ya Ho~")    

// λ°˜ν™˜ν•˜μ§€ μ•Šμ•˜μ§€λ§Œ 컴파일러 κ²½κ³ κ°€ μ—†λ‹€.
// Mu Ya Ho~

3. 마무리 

이번 ν¬μŠ€νŒ…μ—μ„œ Swift ν•¨μˆ˜μ˜ λ‹€μ–‘ν•œ ν˜•νƒœμ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€. λΆ€μ‘±ν•œ λΆ€λΆ„μ΄λ‚˜ 였λ₯˜μΈ 뢀뢄은 지적 κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€^^. κ·Έλ‚˜μ €λ‚˜ λ§₯뢁은 μ–Έμ œ μ˜¬κΉŒμš”.. 

μ°Έμ‘°: μ• ν”Œ API κ°€μ΄λ“œλΌμΈ , μ• ν”Œ 곡식 개발 λ¬Έμ„œ , Swift 5 ν”„λ‘œκ·Έλž˜λ°/ 지은이 μ•Όκ³°