[Swift] ํ๋กํ ์ฝ ์์ฑ์ ์๊ตฌ์ฌํญ (Initializer Requirements)
์ฐธ๊ณ ์๋ฃ: Protocols - swift.org
Syntax
ํ๋กํ ์ฝ์์ Initializer ๋ ๋ฉ์๋ ์ ์ธ ๋ฐฉ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก { } (curly brace) ์์ด init(...) ๊ณผ ๊ฐ์ ๊ผด๋ก ์ ์ธํด์ค๋๋ค.
protocol SomeProtocol {
init(someParameter: Int)
}
Protocol ์ ์ฑํํ Class์ Initializer ๊ตฌํ
ํ๋กํ ์ฝ์ ์ฑํํ ํ์ ์ Initializer๋ฅผ designated initializer๋ convenience initializer๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
ํ๋กํ ์ฝ์ class, struct, enum ํ์ ๋ง ์ฑํํ ์ ์์ต๋๋ค.
๋ ๊ฒฝ์ฐ ๋ชจ๋ `required` ํค์๋๋ฅผ initializer ์์ ๋ถ์ฌ์ฃผ์ด์ผ ํฉ๋๋ค.
SomeClass ๋ฅผ ์๋ธํด๋์ฑํ ํด๋์ค๋ค๋ ํด๋น ํ๋กํ ์ฝ์ conform ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
class SomeClass: SomeProtocol {
required init(someParameter: Int) {
// implementation code
}
}
๋จ protocol๋ฅผ ๊ตฌํํ๋ ํด๋์ค๊ฐ `final class` ๋ผ๋ฉด `required` ๋ฅผ ๋ถ์ผ ํ์๊ฐ ์์ต๋๋ค.
`final class`๋ ์๋ธํด๋์ฑ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
/* required ํค์๋๊ฐ ์์ด๋ Compile Error ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.*/
final class myClass: SomeProtocol {
init(number: Int) {
...
}
}
๊ด๋ จ ๊ธ: Preventing Overrides - swift.org
์ถ๊ฐ์ ์ผ๋ก protocol ์ ์ธ๋ถ์์ initializer์์ `final` ์ ๋ถ์ผ ์ ์๋ค๋ ์ ์ ์๊ธฐํ๊ณ ๊ฐ๊ฒ ์ต๋๋ค.
Failable Initializer Requirements
protocol Something {
init?()
}
struct Some: Something {
init() {
}
}
ํ๋กํ ์ฝ์ ์ ์ธ๋ failable initializer๋ฅผ conforming type์ด non-failable๋ก ๊ตฌํํด๋ ํ๋กํ ์ฝ ์๊ตฌ์กฐ๊ฑด์ ์ถฉ์กฑ๋ฉ๋๋ค.
์ฆ, init?() ์ด๋ init!()์ผ๋ก ์ ์ธ๋ ์์ฑ์๋ฅผ init() ์ผ๋ก ๊ตฌํํ๋ ๊ฒ
๋ฐ๋๋ก non-failable initailizer๋ non-failable ์ด๊ฑฐ๋ IUO failable initializer๋ก ๊ตฌํํด์ผ ํ๋กํ ์ฝ ์๊ตฌ์กฐ๊ฑด์ด ์ถฉ์กฑ๋ฉ๋๋ค.
init()์ผ๋ก ์ ์ธ๋์๋ค๋ฉด init() ์ด๋ init!() ์ผ๋ก ๊ตฌํ๋์ด์ผํ๋ค๋ ๊ฒ
โ๏ธํ๋กํ ์ฝ ์๊ตฌ์ฌํญ์ ์ต์์กฐ๊ฑด์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํฉ๋๋ค.
๊ด๋ จ ๊ธ: Failable Initializer - Initializer
๋!
๋ค์ ๊ธ: Protocol as Types - Protocols