suvera-dev πŸ₯¦

Swift ) Closure λ³Έλ¬Έ

Language/Swift

Swift ) Closure

suvera 2022. 2. 9. 01:41

μ˜€λŠ˜μ€ μŠ€ν„°λ”” μΉœκ΅¬λ“€κ³Ό ν•¨κ»˜ ν΄λ‘œμ €μ— λŒ€ν•œ λ‚΄μš©μ„ κ³΅λΆ€ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€ ! 

 

πŸŒ€Closure λž€? 

- 일정 κΈ°λŠ₯을 ν•˜λŠ” μ½”λ“œλ₯Ό ν•˜λ‚˜μ˜ λΈ”λ‘μœΌλ‘œ λͺ¨μ•„놓은 것

- func ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ§Œλ“€μ—ˆλ˜ ν•¨μˆ˜ : named Closure

- 일반적인 ν΄λ‘œμ € : Unnamed Closureλ₯Ό 지칭 

 

{ (Parameters) -> Return Type in
  μ‹€ν–‰ ꡬ문
}

 

🌿1κΈ‰ κ°μ²΄λ‘œμ„œμ˜ νŠΉμ§• 

- ν΄λ‘œμ €λ₯Ό λ³€μˆ˜λ‚˜ μƒμˆ˜μ— λŒ€μž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
- ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„° νƒ€μž…μœΌλ‘œ ν΄λ‘œμ €λ₯Ό 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.

- ν•¨μˆ˜μ˜ λ°˜ν™˜ νƒ€μž…μœΌλ‘œ ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 


 

일반 ν•¨μˆ˜μ™€ Closure의 μ‚¬μš© λ°©μ‹μ˜ 차이

: ClosureλŠ” ν•¨μˆ˜λ₯Ό func ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•˜λŠ” 것이 μ•„λ‹ˆλΌ, ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— μ„ μ–Έν•˜λŠ” ν˜•νƒœλ₯Ό μ·¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

 

- 일반적인 ν•¨μˆ˜ μ‚¬μš©

var counter = 0
func addCounter() {
  counter += 1
}
addCounter()
addCounter()

print(counter) // κ²°κ³Ό 2

일반적인 ν•¨μˆ˜λŠ” λ‹€μŒκ³Ό 같이 ν•¨μˆ˜λͺ…을 μ„€μ •(addCounter)ν•˜κ³ , ν•΄λ‹Ή ν•¨μˆ˜λͺ…μœΌλ‘œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” ν˜•νƒœλ₯Ό μ·¨ν•©λ‹ˆλ‹€.

 

 

- Closure μ‚¬μš©

var counter = 0
let addCounter = {
    counter += 1
}
addCounter()
addCounter()

print(counter) // κ²°κ³Ό 2

ClosureλŠ” λ³€μˆ˜μ— 값을 μ„ μ–Έν•˜λŠ” λŒ€μ‹ μ— λ³€μˆ˜μ— ν•¨μˆ˜ λ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” addCounter λ³€μˆ˜μ— ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜μ˜€μŠ΅λ‹ˆλ‹€. 그리고 이 λ³€μˆ˜λŠ” ν•¨μˆ˜μ²˜λŸΌ ν˜ΈμΆœμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.(addCounter() ν˜•νƒœ)

 

 

 


 

- Inline Closure : ν•¨μˆ˜λ‘œ λ”°λ‘œ μ •μ˜λœ ν˜•νƒœκ°€ μ•„λ‹Œ μΈμžλ‘œ λ“€μ–΄κ°€ μžˆλŠ” ν˜•νƒœμ˜ ν΄λ‘œμ €

let reverseNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2})

μœ„μ™€ 같은 ν˜•νƒœμ—μ„œ ν΄λ‘œμ €μ˜ μΆ•μ•½ ν‘œν˜„μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€ 

νƒ€μž…, λ°˜ν™˜ν‚€μ›Œλ“œ, μΈμžμ΄λ¦„μ„ μƒλž΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€ 

// νƒ€μž… μƒλž΅ : μ½”λ“œμ˜ λͺ¨ν˜Έμ„±μ„ ν”Όν•˜κΈ° μœ„ν•΄ νƒ€μž…μ„ λͺ…μ‹œν•˜λŠ” 것이 μ’‹μ„λ•Œλ„ μžˆλ‹€.
let reverseNames = names.sorted(by: {s1, s2 in return s1 > s2})
// λ°˜ν™˜ ν‚€μ›Œλ“œ μƒλž΅ 
let reverseNames = names.sorted(by: {s1, s2 in s1 > s2}) 
// 인자 값을 μΆ•μ•½ : $0 λΆ€ν„° μˆœμ„œλŒ€λ‘œ 
let reversedNames = names.sorted(by: { $0 > $1 })
// μ—°μ‚°μž λ©”μ†Œλ“œ : μ—°μ‚°μžλ§Œ 남길 수 있음
let reversedNames = names.sorted(by: > )

 

- Trailing closure (ν›„ν–‰ ν΄λ‘œμ €): ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜ λ§ˆμ§€λ§‰μœΌλ‘œ μ „λ‹¬λ˜λŠ” ν΄λ‘œμ €

인자둜 ν΄λ‘œμ €λ₯Ό λ„£κΈ°κ°€ κΈΈλ‹€λ©΄ ν›„ν–‰ ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•¨μˆ˜μ˜ 뒀에 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€ ! 

λ§Œμ•½ ν΄λ‘œμ € 내뢀에 μ—¬λŸ¬ μ€„μ˜ μ‹€ν–‰ μ½”λ“œκ°€ μžˆλ‹€λ©΄ ν›„ν–‰ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•΄ 가독성을 λ†’μ΄λŠ” 것이 μ’‹λ‹€κ³  ν•©λ‹ˆλ‹€ 
λ§ˆμ§€λ§‰ 전달 인자둜 μ „λ‹¬λ˜λŠ” ν΄λ‘œμ €μ—λ§Œ ν•΄λ‹Ήλœλ‹€λŠ” 것을 κΈ°μ–΅ !

let reversedNames = names.sorted { $0 > $1 }
let reversedNames = names.sorted { (s1: String, s2: String) -> Bool in return s1 > s2 }

 


μ˜ˆμ‹œ - Closureλ₯Ό ν™œμš©ν•œ 데이터 전달 

- 데이터λ₯Ό 전달 λ°›λŠ” VC에 ν”„λ‘œνΌν‹° μ„ μ–Έ 

    var categoryId: Int
    var titleText: String
    var iconImageId: Int

- 데이터λ₯Ό μ „λ‹¬ν•˜λŠ” Cellμ—μ„œ ν΄λ‘œμ € μ„ μ–Έ -> Cell μ•ˆμ— μžˆλŠ” λ²„νŠΌμ„ λˆŒλ €μ„ λ•Œ ν΄λ‘œμ €κ°€ μ‹€ν–‰ λ˜λ„λ‘ ! 

var presentEditCategoryClosure: (() -> Void)?

    private func bind() {
        editButton.rx.tap
            .bind(onNext: { [weak self] in
                self?.presentEditCategoryClosure?()
            })
            .disposed(by: disposeBag)
    }

- CollectionViewDataSource μ—μ„œ Cell 의 데이터λ₯Ό 지정할 λ•Œ μ‹€μ œ κ΅¬ν˜„ μ½”λ“œ μž‘μ„± 

func collectionView(_ collectionView: UICollectionView,
                        cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(forIndexPath: indexPath) as CategoryCollectionViewCell
        
        cell.configure(type: .manage)
        cell.update(data: categories[indexPath.row])
        cell.presentEditCategoryClosure = {
            let categoryId = self.categories[indexPath.row].id ?? 0
            let titleText = self.categories[indexPath.row].title ?? ""
            let imageId = self.categories[indexPath.row].imageId ?? 0
            
            self.navigationController?.pushViewController(editCategory, animated: true)
        }

 

- Alert : 확인 λ²„νŠΌμ„ λˆ„λ₯Ό λ•Œ Closure μ‚¬μš©

extension UIViewController {
    func makeAlert(title: String,
                   message: String,
                   okAction: ((UIAlertAction) -> Void)? = nil,
                   completion : (() -> Void)? = nil) {
        let alertViewController = UIAlertController(title: title,
                                                    message: message,
                                                    preferredStyle: .alert)
        let okAction = UIAlertAction(title: "확인", style: .default, handler: okAction)
        alertViewController.addAction(okAction)
        self.present(alertViewController, animated: true, completion: completion)
    }
}
self.makeAlert(title: "μΉ΄ν…Œκ³ λ¦¬ μˆ˜μ •", message: "μΉ΄ν…Œκ³ λ¦¬ μˆ˜μ • 성곡", okAction: { [weak self] _ in
    self?.titleText = self?.categoryTitleTextField.text ?? ""
    self?.sendEditData?()
    self?.navigationController?.popViewController(animated: true)
})

 

πŸ”–μ°Έκ³ ν•œ μ‚¬μ΄νŠΈ

 

 

였늘의 Swift 상식 (Closure)

ν΄λ‘œμ €(Closure)λž€?

medium.com

 

Swift Closure

Swift의 closure에 λŒ€ν•΄ μ•Œμ•„λ΄…λ‹ˆλ‹€.

hcn1519.github.io

 

πŸ”– 같이 μŠ€ν„°λ””ν•œ μΉœκ΅¬λ“€μ˜ ν‹°μŠ€ν† λ¦¬

 

 

[iOS/Swift] Closure에 λŒ€ν•΄ μ•Œμ•„λ³΄μž

λ“€μ–΄κ°€λ©° ν΄λ‘œμ €λž€ 이λ₯Έλ°” 이름 μ—†λŠ” ν•¨μˆ˜, “읡λͺ… ν•¨μˆ˜"둜 λΆˆλ¦¬λŠ” μ½”λ“œλΈ”λŸ­μž…λ‹ˆλ‹€. 이번 κ²Œμ‹œκΈ€μ—μ„œλŠ” iOS κ°œλ°œμ„ ν•˜λ©° μ •~말정말 많이 μ‚¬μš©ν–ˆλ˜ 문법인 ν΄λ‘œμ €μ— λŒ€ν•΄ νƒκ΅¬ν•΄λ³΄λŠ” μ‹œκ°„μ„ 가지

osoomoovo.tistory.com

 

πŸ”– μΆ”κ°€μ μœΌλ‘œ κ³΅λΆ€ν• λ§Œν•œ λ‚΄μš©

λ‹€μŒμ—λŠ” Escaping Closure와 Completion Handler에 λŒ€ν•œ λ‚΄μš©λ„ 정리해 λ³΄κ² μŠ΅λ‹ˆλ‹Ή 

 

 

[SWIFT] Escaping Closure(νƒˆμΆœ ν΄λ‘œμ €)

ν΄λ‘œμ €μ˜ 기본에 λŒ€ν•΄ ν¬μŠ€νŒ…μ„ ν•œ 적이 μžˆμ—ˆλŠ”λ°μš”. μ΄λ²ˆμ—λŠ” ν΄λ‘œμ € ν™œμš©μ— λŒ€ν•΄ ν¬μŠ€νŒ…μ„ ν•΄λ³Όκ²Œμš”. 이전 ν¬μŠ€νŒ…μ„ μ•ˆλ³΄μ‹  뢄은 보고 μ˜€μ‹œλ©΄ 쒋을 것 κ°™μ•„μš”. [SWIFT] Closure(ν΄λ‘œμ €) (1/2) μ˜€λŠ˜μ€

dongminyoon.tistory.com

 

[iOS] Completion Handler

Completion Handler λ³Έ λ¬Έμ„œμ—λŠ” ν‰μ†Œμ— 곡뢀λ₯Ό μ§„ν–‰ν•˜λ©° ν•œλ²ˆ 정리가 ν•„μš”ν•˜λ‹€κ³  μƒκ°ν–ˆλ˜ Completion Handler 에 λŒ€ν•œ λ‚΄μš©μ„ κΈ°μž¬ν•œλ‹€. Prerequisite Completion Handler κ°œλ…μ€ μ•Œλ©΄ μ•Œμˆ˜λ‘ μ–΄λ €μš΄ κ°œλ…μ΄λ‹€....

duwjdtn11.tistory.com

 

Swift Escaping Closure μ΄ν•΄ν•˜κΈ°

Swift의 Escaping Closure에 λŒ€ν•΄ μ•Œμ•„λ΄…λ‹ˆλ‹€.

hcn1519.github.io

Comments