ํ๋กํ ์ฝ์ ์ด๋ฆ์ ์ง์ ํ๋ ์ ํธํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? "able" ๋๋ "ing" ์ ๋ฏธ์ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๊ฝค ์ข์ ๋ต๋ณ์ผ๋ก ์ด StackExchange ์ง๋ฌธ ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
์ด๊ฒ์ ์คํ์ผ ๊ฐ์ด๋์ ์ถ๊ฐํด์ผ ํฉ๋๊น?
C# ์ด๋ฆ ์คํ์ผ์ Swift๋ก ๋ฒ์ญํ๋ ๊ฒ์ ์ด๋ ค์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ธํฐํ์ด์ค์ 'I'๋ ๋ค์์คํ์ด์ค๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ .NET์์ ์๋ํฉ๋๋ค.
๋๋ช
์ฌ("able" ๋ฐ "ing")๋ ์์ด์ ์ ์ฌํ๊ฒ ์๋ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
"๋๋ช
์ฌ๋ ๋์ฌ์ "-ing"์ ๋ถ์ฌ ๋ง๋ ๋ช
์ฌ์
๋๋ค.
์: ์ด ํด๋์ค๋ฅผ ํด์(๋์ฌ)ํด์ผ ํฉ๋๋ค. ํด์ ๊ฐ๋ฅ(๋๋ช ์ฌ)์ ๋๊น? ๋น๊ตํ๊ณ ์ถ์ต๋๋ค(๋์ฌ), ์ด ํด๋์ค๋ ๋น๊ตํ ์ ์์ต๋๊น(๋๋ช ์ฌ)?
C#์ ๋ณด๋ฉด ๋ชจ๋ ์ธํฐํ์ด์ค์ ๋๋ช ์ฌ๋ฅผ ์ฌ์ฉํ์ง๋ ์์ต๋๋ค. Point(ํด๋์ค) ๋ฐ IPoint(X ๋ฐ Y๋ฅผ ๊ตฌํํ๋ ์ธํฐํ์ด์ค)๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ์๋ฏธ ์๋ ๊ฒ์ ๋ง๋๋ ๊ฒ์ ์ฝ๊ฐ ์คํด์ ์์ง๊ฐ ์์ต๋๋ค.
UITableViewDelegate ๋ฐ UITableViewDataSource์ ๊ฐ์ ํ๋กํ ์ฝ์ ๋์๊ฒ ์ ํฉํฉ๋๋ค. ๋๋ ๊ฐ์ธ์ ์ผ๋ก ...ํ๋กํ ์ฝ ์ ๋ฏธ์ฌ์ ๋ฌธ์ ๊ฐ ์์ง๋ง ์ผ๋ฐ์ ์ธ ๊ท์น์ผ๋ก ์ํ์ง๋ ์์ต๋๋ค. ๋๋ก๋ 'able'์ด ๋ ์ ์๋ํ๊ณ ๋๋ก๋ ...Delegate ๋๋ ...DataSource์ ๊ฐ์ ๋ค๋ฅธ ์ ๋ฏธ์ฌ๊ฐ ๋ ์ ํฉํฉ๋๋ค.
์ค๋ ๋ง๋ค์ด์ง๋ฉด UITableViewDelegateType ๋ฐ UITableViewDataSourceType์ด๋ผ๊ณ ๋ถ๋ฅผ ๊ฑฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค. Greg Heo๋ ์ด๊ฒ์ "is a"๋ผ๊ณ ๋ถ๋ฆ ๋๋ค: http://www.skilled.io/gregheo/what-the-55-swift-standard-library-protocols-taught-me
๋ด ์์ ์ ๋ง์ ํ๋กํ ์ฝ์ ํ๋์ ๊ธฐ๋ฅ์ด๋ ์์ฑ๋ง ์บก์ํํฉ๋๋ค. Swift๋ ํ๋กํ ์ฝ ์ด๋ฆ์ ๊ฐ์ ์ด๋ฆ์ผ๋ก ์ง์ ํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ๋งค์ฐ ๊นจ๋ํ ์ ๊ทผ ๋ฐฉ์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
protocol bool {
var bool: Bool {get}
}
struct Struct: bool {
let bool = true
}
ํ์ํ ๋ ์ผ๋ฐ ๋๋ฆฌ์ ๋ฐ ๋ฐ์ดํฐ ์์ค ๋ช
๋ช
๊ท์น์ ์ฌ์ฉํ์ง๋ง ๋จ์ํ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํ๋กํ ์ฝ์ ๊ฒฝ์ฐ ์ด๋ฆ์ Protocol
๋ฅผ ๋ฃ์์ต๋๋ค. ์ด๊ฒ์ด ๋ชจ๋ฒ ์ฌ๋ก์ธ์ง ์๋์ง ํ์คํ์ง ์์ต๋๋ค. ์กฐ์ฌํ์ ๋ ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์์์ต๋๋ค.
protocol AlertModalProtocol {
func titleText() -> String
func messageText() -> String
}
struct NewUserAlertModal: AlertModalProtocol {
func titleText() -> String {
return "Welcome new user"
}
func messageText() -> String {
return "Thanks for joining the app."
}
}
@mitchellporter ๊ฐ ํ๋ ๊ฒ์ฒ๋ผ "ํ๋กํ ์ฝ"์ ์ฌ์ฉํ์๋ ์ ์์ ๋ณด์์ง๋ง "์ ํ" ์ ๋ฏธ์ฌ๋ ๊ณต๋ฃก์ ๊ธธ์ ๊ฐ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
Swift API ๋์์ธ ์ง์นจ์์ :
๋ฌด์์ธ๊ฐ๋ฅผ ์ค๋ช ํ๋ ํ๋กํ ์ฝ์ ๋ช ์ฌ๋ก ์ฝ์ด์ผ ํฉ๋๋ค(์: ์ปฌ๋ ์ ). ๊ธฐ๋ฅ์ ์ค๋ช ํ๋ ํ๋กํ ์ฝ์able, ible ๋๋ ing ์ ๋ฏธ์ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฆ์ ์ง์ ํด์ผ ํฉ๋๋ค(์: Equatable, ProgressReporting).
๊ทธ ํฅ๋ฏธ ๋กญ๊ตฐ์. ๋ด ๊ฒฝํ์, Thing์ ์ ํต์ ์ผ๋ก ๋น์ถ์ ํด๋์ค์์ ๋ ThingType์ด ํ์ํ์ต๋๋ค. (์ฆ, Thing์ ThingType์ ๊ตฌํํ๋ ๊ตฌ์ฒด์ ์ธ ์ ํ์ด๊ณ ๋ ๊ตฌ์ฒด์ ์ธ ๋ค๋ฅธ ์ ํ๋ ThingType์ ๊ตฌํํฉ๋๋ค.) NSObjectProtocol์ ์ด๋ฌํ ์ ํ์ ์์ ๋๋ค.
API ๋์์ธ ์ง์นจ ์ด์์ ๋ผ์ธ์ ๋ฐ๋ผ ๋ช ๊ฐ์ง ํ ์คํธ๋ฅผ ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
๋น ๋ฅธ
๋ค๋ฅธ ์ฌ๋์ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ๋ฌธ์ ์ ์ง๋ฉดํ์ต๋๋ค. ๋ฌด์์ธ์ง, ๋ช
์ฌ์ผ ๋ ์ค๋ช
ํ๋ ํ๋กํ ์ฝ์ด ์ข
์ข
ํด๋์ค ๋ฉ์๋์ ํผ๋๋๊ธฐ ๋๋ฌธ์ ์กฐ์ฉํ ๋ถํธํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ค์ ๊ท์น์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค.
When the protocol name is a noun - write ..Protocol (yes, even in swift);
์: PhotoModuleProtocol
When the protocol is an adverb or an adjective - write ..able, ..ing and so on;
์: ํ
์คํธ ๊ฐ๋ฅ
๋ด ์๊ฐ์๋ Swift hipster์ ๊ฒ๋ณด๋ค ๋๊ตฐ๊ฐ์ ์ฝ๋๋ฅผ ์ธ์ํ๋ ์๊ฐ์ ์นด์ดํธ๋ค์ดํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ๋ช ์์ ์ผ๋ก ์ง๊ธ ๋ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
2015๋ ์ ๋ง์ง๋ง ๋๊ธ์ ๊ฒ์ํ์ต๋๋ค... ๊ทธ ์ดํ๋ก @gregheo๊ฐ ์ด์ ์ ๊ณต์ ํ ๊ฒ์ ์ฃผ๋ก ์ฌ์ฉํ๋๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ์ต๋๋ค.
๋ฌด์์ธ๊ฐ๋ฅผ ์ค๋ช ํ๋ ํ๋กํ ์ฝ์ ๋ช ์ฌ๋ก ์ฝ์ด์ผ ํฉ๋๋ค(์: ์ปฌ๋ ์ ). ๊ธฐ๋ฅ์ ์ค๋ช ํ๋ ํ๋กํ ์ฝ์able, ible ๋๋ ing ์ ๋ฏธ์ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฆ์ ์ง์ ํด์ผ ํฉ๋๋ค(์: Equatable, ProgressReporting).
์๋ฅผ ๋ค์ด ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ๋ชจ๋ธ ์ ํ์ด ์์ต๋๋ค.
protocol BaseType {
var objectId: String { get set }
var createdAt: NSDate? { get set }
var updatedAt: NSDate? { get set }
func toJSON() -> [String: AnyObject]
static func from(json: [String: AnyObject]) -> AnyObject
}
์ฑ ์ ์ฒด์ ๋ชจ๋ ๋ชจ๋ธ์๋ ์ด ๊ธฐ๋ฅ์ด ํ์ํ๋ฏ๋ก ๋ชจ๋ BaseType
๋ฐ๋ฆ
๋๋ค. ์ค์ ๋ก ์ฑ ์ด๋ฆ์ ๋ฐ์ ์ด ๊ธฐ๋ณธ ์ ํ์ ์ด๋ฆ์ ์ง์ ํ์ผ๋ฏ๋ก ์ฑ ์ด๋ฆ์ด Instagram
์ด๋ฉด InstagramType
๋ฉ๋๋ค. ์ง๊ธ ์๊ฐํด๋ณด๋ ์ด๋ฆ์ Type
๋ฅผ ํฌํจํ๋ ๊ฒ์ ๋ฌด์๋ฏธํด ๋ณด์
๋๋ค... ์ด๋ฆ์ BaseModel
, InstagramModel
๋๋ ์ฌ์ง์ด Model
.
๊ธฐ๋ฅ์ ์ค๋ช ํ๋ ํ๋กํ ์ฝ์ ๊ดํด์๋ ๊ฐ๋ฅ, ible ๋ฐ ing ์ ํ ์ ๋ฏธ์ฌ๋ ์ฌ์ฉํ์ต๋๋ค.
๋ด ์ด๋ฆ์ protocol
๋ผ๋ ๋จ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ค๋ณต๋๋ ๋๋์ด ๋ค์๊ณ "์ด๋ด, ์ด๊ฒ์ ํด๋์ค๊ฐ ์๋ ํ๋กํ ์ฝ์
๋๋ค" ํ๋กํ ์ฝ์ ํด๋์ค ์๊ฐ ์๋ ๊ฒฝ์ฐ ์ ์ํ๊ฒ ํด๋์ค์ ๋์ผํ๊ฒ ๊ฐ์ฃผ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์๋ชป๋ ๊ฒ์
๋๋ค.
๋ฐ๋ผ์ ์ด๋ฆ์ ํ๋กํ ์ฝ์ ํฌํจํ์ฌ ๋จ์ผ ํญ๋ชฉ์ผ๋ก ์ง์ ํ์ง ์๊ณ ๊ทธ๋ฅ ๋ก๋๋ค. ์ด๊ฒ์ ๋จ์ง ๋์๊ฒ ์ณ๋ค๊ณ ๋๋ผ๋ ๊ฒ์ด๋ฉฐ, ๋๋ ์ด๊ฒ์ด ์ณ๋ค ๊ทธ๋ฅด๋ค๋ฅผ ์ฃผ์ฅํ์ง ์์ต๋๋ค. ๋ช ๋ ์ด ์ง๋ ํ์๋ ๋๋ ํญ์ Swift์์ ์๋ก์ด ๊ฒ์ ๋ฐ๊ฒฌํ๊ณ ์์ผ๋ฉฐ ๋ชจ๋ ๊ฒ์ ์์๋ด๋ ค๋ ์๋๋ฅผ ํฌ๊ธฐํ์ต๋๋ค. ์ค์ ๋ก ์ด ์์ ์์ ์ปค๋ฎค๋ํฐ๊ฐ ๋ฌด์์ ์ ๊ณตํ๋์ง ์คํํ๊ณ ํ์ธํ๋ ค๊ณ ํฉ๋๋ค. :)
๊ทธ๋๋ ๋ช ์ฌ๋ก ํ๋กํ ์ฝ์ ๋ช ๋ช ํ๋ฉด ํด๋์ค๊ฐ ์๋๋ผ ํ๋กํ ์ฝ์์ ํ์ธํ๊ธฐ ์ํด ๋จ์ด("..Model", "..Type" ๋ฑ์ด ๋ ์ ์์)๊ฐ ์ถ๊ฐ๋ฉ๋๋ค. ์ด ๋จ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ง์ผ๋ก ๋ณ๊ฒฝ =)
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@mitchellporter ๊ฐ ํ๋ ๊ฒ์ฒ๋ผ "ํ๋กํ ์ฝ"์ ์ฌ์ฉํ์๋ ์ ์์ ๋ณด์์ง๋ง "์ ํ" ์ ๋ฏธ์ฌ๋ ๊ณต๋ฃก์ ๊ธธ์ ๊ฐ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
Swift API ๋์์ธ ์ง์นจ์์ :