λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

🍎 iOS & Swift

[iOS] λ‚˜λ„ λͺ¨λ₯΄κ²Œ μ‚¬μš©ν•˜κ³  μžˆμ—ˆλ˜ Generic

Generic(μ œλ„€λ¦­)

Generic은 쀑볡을 ν”Όν•˜λ©΄μ„œ 맀우 μœ μ—°ν•˜κ³  μž¬μ‚¬μš© κ°€λŠ₯ν•œ ν•¨μˆ˜μ™€ νƒ€μž…μ„ μž‘μ„±ν•  수 μžˆλ„λ‘ ν•΄μ€€λ‹€.

사싀 이둠으둜써 Generic은 κ·Έλ ‡κ²Œ μ–΄λ €μš΄ κ°œλ…μ΄ μ•„λ‹™λ‹ˆλ‹€. 기본적인 κ°œλ…μ€ μœ„μ—μ„œ μ–ΈκΈ‰ν•œ λ‚΄μš©μ΄ 닀라고 μƒκ°ν•˜λŠ”λ°μš”.
(λ¬Όλ‘  이외에도 μ—¬λŸ¬κ°€μ§€ μ„€λͺ…은 뢙을 수 μžˆκ² μ§€λ§Œ!)

 

μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λ €κ³  ν•  λ•Œμ—λŠ” μ œλ„€λ¦­μ΄ ν•„μš”ν•œ νƒ€μž… λ˜λŠ” λ©”μ„œλ“œ λ°”λ‘œ 뒀에 κ΄„ν˜Έ(<>) 사이에 placeholder(ex: T, V, U)λ₯Ό 적어주어 μ‚¬μš©ν•©λ‹ˆλ‹€.

 

 

νƒ€μž… λ˜λŠ” λ©”μ„œλ“œ 이름<νƒ€μž… λ§€κ°œλ³€μˆ˜(T)>

 

μ‚¬μš©λ²•μ€ 어렡지 μ•ŠμŠ΅λ‹ˆλ‹€. λ¬Έμ œλŠ” λ‚΄ μžμ‹ μ΄ Generic을 μ‚¬μš©μ΄ ν•„μš”ν•œ κ³³μ—μ„œ 적절히 μ‚¬μš©κ°€λŠ₯ν•œκ°€ 이것이겠죠.

 


 

Generic μ‚¬μš© μ˜ˆμ‹œ(1) - μ„œλ²„ 톡신 κ²°κ³Όλ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ Enum

// NetworkResult.swift
enum NetworkResult<T> {
  case success(T)
  case requestErr(T)
  case pathErr
  case severErr
  case networkFail
}

μ œκ°€ 처음(μ—„λ°€νžˆ λ§ν•˜μžλ©΄ μ²˜μŒμ€ μ•„λ‹ˆμ§€λ§Œ)으둜 μ œλ„€λ¦­μ„ μ•Œκ²Œ λͺ¨λ₯΄κ²Œ μ‚¬μš©ν–ˆλ˜ 건
μ„œλ²„ 톡신 κ²°κ³Όλ₯Ό 각 κ²½μš°μ— 따라 μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ Enum을 λ§Œλ“€μ—ˆλ˜ λ•ŒμΈλ°μš”.

(이 λ•ŒλŠ” Enum도 μ™œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”μ§€λ„ λͺ¨λ₯Έ 채 λ”°λΌμΉ˜κ³  μžˆμ—ˆλ‹€... λ¬Όλ‘  μ§€κΈˆλ„ μž˜ν•˜λŠ” 건 μ•„λ‹ˆμ§€λ§Œ...)

πŸ’πŸ» μ΄μ–΄μ„œ 이야기λ₯Ό 해보죠.
μ„œλ²„μ™€μ˜ 톡신을 마치고 λ‚˜λ©΄ Response(응닡)이 λŒμ•„μ˜¬ν…λ°,
Response의 경우 Success(성곡) λ˜λŠ” Fail(μ‹€νŒ¨) λ‘˜ 쀑에 ν•˜λ‚˜μΌν…λ°μš”.


νŠΉνžˆλ‚˜ μ„œλ²„ 톡신이 μ„±κ³΅μ μœΌλ‘œ 마무리되면 μ›ν•˜λŠ” 데이터λ₯Ό μš°λ¦¬λŠ” λ°›κ²Œ 되죠. 이것이 .success(T) 일 λ•Œμ˜ μ²˜λ¦¬μΌκ±°μ˜ˆμš”.
κ·Έ 데이터λ₯Ό 가지고 μš”λ¦¬μ‘°λ¦¬ 처리λ₯Ό ν•΄μ„œ 멋진 결과물을 λ§Œλ“€κ² μ£ ..?! ✨


μ„±κ³΅ν–ˆμ„ λ•Œ μ–΄λ–€ dataλ₯Ό λ‹΄μ•„μ„œ λ³΄λ‚΄κ²Œ 될 텐데, 이 λ•Œ Generic으둜 νƒ€μž…μ„ λ§Œλ“€μ–΄λ†“μœΌλ©΄ μ–΄λ–€ 값이 듀어와도 νŽΈν•˜κ²Œ ν›„μ²˜λ¦¬λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 


 

Generic μ‚¬μš© μ˜ˆμ‹œ(2) - μ²˜μŒμ— 우리λ₯Ό μ—„μ²­λ‚˜κ²Œ κ΄΄λ‘­ν˜”λ˜, Optional

enum Optional<T> {
  case none           // nil
  case some(T)        // optional value
}

μ„Έμƒμ—λ‚˜... Optional도 Enum으둜 κ΅¬ν˜„λ˜μ–΄ 있고, νƒ€μž…μ€ Generic μ΄λΌλ‹ˆ...
none은 아무 값도 μ„€μ •λ˜μ–΄ μžˆμ§€ μ•Šμ€ 경우인 nil을 μ˜λ―Έν• ν…Œκ³ ,
some은 μ–΄λ–€ 값을 가지고 μžˆλ‹€λŠ” 것이겠죠..? 그리고 Generic으둜 νƒ€μž…μ„ λ§Œλ“€μ–΄ λ†“μ•˜μœΌλ‹ˆ κ·Έ 값은 Int, String λ“± μ–΄λ–€ νƒ€μž…μ΄λ“  κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.


처음 λ΄€μ„λ•ŒλŠ” κ½€λ‚˜ μ‹ μ„ ν•œ μΆ©κ²©μ΄μ—ˆμŠ΅λ‹ˆλ‹€... μ•Œκ³ λ‚˜μ„œ λ³΄λ‹ˆκΉ μ’€ μ‹ κΈ°ν–ˆκ±°λ“ μš”!

 

 


 

Generic μ‚¬μš© μ˜ˆμ‹œ(3) - TableViewCell Extensionsμ—μ„œλ„ 봀던 것 같은데...

// μ΅μŠ€ν…μ…˜ 적용 (μ „) - Dequeuing Cell
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: “TableViewCell”, for: indexPath) as! TableViewCell
    return cell
}
// μ΅μŠ€ν…μ…˜ + μ œλ„€λ¦­μ„ μ΄μš©ν•œ Dequeuing Cell
import UIKit

extension UITableView {
    func cell<T: UITableViewCell>(cellForRowAt indexPath: IndexPath) -> T {
        guard let cell = self.dequeueReusableCell(withIdentifier: “\(T.self)”, for: indexPath) as? T else {
          fatalError("Could not find cell with reuseID \(T.self)")
        }
        return cell
    }
}
// μ΅μŠ€ν…μ…˜ 적용 (ν›„) - Dequeuing Cell
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.cell(for: TableViewCell.self)
    return cell
}

λ„€, μ½”λ“œλ₯Ό μ „λΆ€ λ³Ό ν•„μš”λŠ” μ—†κ΅¬μš”...
μš°λ¦¬λŠ” 곡뢀λ₯Ό ν•˜λ‹€λ³΄λ©΄ μ’€ 더 μ‰¬μš΄ 방법, νŽΈν•œ 방법을 μ°Ύκ³ λŠ” ν•©λ‹ˆλ‹€.


TableViewλ‚˜ CollectionViewλ₯Ό μ‚¬μš©ν•˜λ‹€λ³΄λ©΄ Cell을 Dequeueν•΄μ„œ μ‚¬μš©ν•˜λŠ” 것은 ν•„μˆ˜μΈλ°μš”.
Cell을 μ’€ 더 νŽΈν•˜κ²Œ Dequeueν•˜λ €κ³  Extension을 μ‚¬μš©ν•˜λŠ” 것을 적지 μ•Šκ²Œ λ³Ό μˆ˜κ°€ μžˆμ–΄μš”!


κ·Έ λ™μ•ˆ 아무생각없이 μ‚¬μš©ν•˜λ‹€κ°€ λ‹€μ‹œ μ‚΄νŽ΄λ³΄λ‹ˆ <T: UITableViewCell> 이 녀석도 Generic을 μ‚¬μš©ν–ˆλ˜κ±°μž–μ•„..!!
근데 μœ„μ—μ„œ μ‚΄νŽ΄λ΄€λ˜ κ²ƒμ΄λž‘ 쑰금 λ‹€λ₯Έ 점이 μžˆμ–΄μš”. 콜둠(:)ν•˜κ³  νŠΉμ • νƒ€μž…(UITableViewCell)이 λͺ…μ‹œλ˜μ–΄μžˆλ„€μš”?


νƒ€μž… μ œμ•½μ„ μ‹œμΌœμ£Όκ³  μžˆλŠ” κ²ƒμΈλ°μš”. 'UITableViewCell νƒ€μž…μ—λ§Œ cell λ©”μ„œλ“œλ₯Ό λ™μž‘ν•˜λ„λ‘ ν•˜κ² λ‹€' μ •λ„μ˜ 의미둜 μƒκ°ν•˜λ©΄ 될 것 κ°™μ•„μš”.
그럼 μ’€ 더 μ•ˆμ „ν•˜κ²Œ κΈ°λŠ₯을 μ‚¬μš©ν•˜λ„λ‘ ν•  수 있겠죠!

 

 


 

마무리

κ·Έ λ™μ•ˆ λ„ˆλ¬΄ λ‹Ήμ—°ν•˜κ²Œ μƒκ°ν•˜κ³  μ‚¬μš©ν•˜κ³  μžˆμ—ˆλ˜ Genericμ΄λΌλŠ” μΉœκ΅¬μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μ•˜λŠ”λ°μš”.
사싀 λ„ˆλ¬΄ μƒλž΅ν•œ 뢀뢄이 많긴 ν•˜μ§€λ§Œ 사싀 κ°œλ…μ μΈ 뢀뢄은 λ‹€λ₯Έ λΈ”λ‘œκ·Έλ‚˜ 책에 λ„ˆλ¬΄ 잘 λ‚˜μ™€μžˆμ–΄μ„œ
λŒ€μ‹ μ— ν‰μ†Œμ— κΆκΈˆν–ˆμ—ˆλ˜, κ·Έλƒ₯ λ„˜μ–΄κ°”λ˜ λΆ€λΆ„κ³Ό 연관지어 λͺ‡ 자 μ μ–΄λ΄€μŠ΅λ‹ˆλ‹€.


더 μžμ„Έν•œ λ‚΄μš©μ€ 검색을 톡해 찾아보면 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€.

 

μ œλ„€λ¦­μ„ ν•œ λ§ˆλ””λ‘œ λ§ν•˜λ©΄ μš”λ ‡κ²Œ 말할 수 μžˆμ„κΉŒμš”..?

 

Generic은 카멜레온 같은 녀석! λˆ„κ΅¬λ„ 될 수 μžˆλ‹€.

λ§ˆμ§€λ§‰ 말은 μžŠλ„λ‘ ν•©μ‹œλ‹€ γ…Žγ…Ž