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์ ์นด๋ฉ๋ ์จ ๊ฐ์ ๋ ์! ๋๊ตฌ๋ ๋ ์ ์๋ค.
๋ง์ง๋ง ๋ง์ ์๋๋ก ํฉ์๋ค ใ ใ
'๐ iOS & Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] ์ต์ ๋, Optional (0) | 2021.08.18 |
---|---|
iOS Issue(1) - Build input file cannot be found (0) | 2021.07.30 |
[iOS] CollectionView์ PageControl๋ก Pager ๊ตฌํํ๊ธฐ (9) | 2021.07.26 |
[iOS] ๋ฐฐ์ด์ ๊ณ ์ฐจ ํจ์ - Higher Order Fuctions (0) | 2021.07.24 |
[Alamofire Mapper] URLRequestConvertible ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2021.07.23 |