Initalization (์ด๊ธฐํ)
์ด๊ธฐํ๋ class, struct, enum์ ์ธ์คํด์ค์ ์ฌ์ฉ์ ์ํด ์ค๋นํ๋ ๊ณผ์
์๋ก์ด ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ ์ค๋น๋ฅผ ํ๊ธฐ ์ํด ์ธ์คํด์ค์ ์ ์ฅ ํ๋กํผํฐ์ ์ด๊ธฐ๊ฐ์ ์ค์ ํ๋ ๋ฑ์ ์ผ์ ํ๋ค.
์ด๋์ ๋ผ์ด์ init
ํ๋กํผํฐ ์ด๊ธฐ๊ฐ์ ์ง์ ํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ์๋ ์ด๋์ ๋ผ์ด์ init์ ํตํด ์ธ์คํด์ค๊ฐ ๊ฐ์ ธ์ผ ํ ์ด๊ธฐ๊ฐ์ ์ ๋ฌํ ์ ์๋ค.
์ด๋์ ๋ผ์ด์ ๋ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ ํน๋ณํ ๋ฉ์๋๊ฐ ๋๋ ๊ฒ
์ฃผ์ ์ญํ ์ ์ ์ธ์คํด์ค๊ฐ ์ฒ์ ์ฌ์ฉ๋๊ธฐ ์ ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ด๊ธฐํ๋์๋์ง ํ์ธํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ฐํํ์ง ์์
initializer์ ์ข ๋ฅ
ํด๋์ค์ ๋ชจ๋ ํ๋กํผํฐ๋ ์ด๊ธฐํ ๊ณผ์ ์์ ๋ฐ๋์ ์ด๊ธฐ๊ฐ์ด ํ ๋น๋์ด์ผ ํจ
์์๋ฐ์ ํด๋์ค๊ฐ ์๋ ๊ฒฝ์ฐ, ์์ ํด๋์ค์ ํ๋กํผํฐ๋ ๋ชจ๋ ์ด๊ธฐํ ๋์ด์ผ ํจ
Swift์์๋ ๋ชจ๋ ํด๋์ค์ init์ด ๋ณด์ฅ๋ ์ ์๋๋ก ๋ ๊ฐ์ง ์ด๊ธฐํ ๋ฉ์๋๋ฅผ ์ ๊ณต (designated, convenience)
Designated Initializer (์ง์ ์ด๊ธฐํ)
- ํด๋์ค์ ์ง์ ๋ ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ์ด๊ธฐํํ๊ณ ์์๋ฐ์ ํด๋์ค๊ฐ ์๋ ๊ฒฝ์ฐ, ์ํผ ํด๋์ค์ init์ ํธ์ถ
- ํด๋์ค๋ ์ต์ ํ๋ ์ด์์ designated initializer๋ฅผ ๊ฐ๋๋ค
Convenience Initializer
- ํด๋์ค์ ์ง์๋๋ ๋ณด์กฐ์ ์ธ initializer
- ์๋ฌด๋ก ๊ผญ ์์ฑ๋์ด์ผ ํ๋ ๊ฒ ์๋
- ํ์ํ ๊ฒฝ์ฐ ์์ฑ ๊ฐ๋ฅ
- Designated Initalizer ์์ฑ ํ ์ฌ์ฉ ๊ฐ๋ฅ
class PersonC {
var name: String
var age: Int
var nickName: String?
init(name: String, age: Int) {
self.name = name
self.age = age
}
convenience init(name: String, age: Int, nickName: String) {
self.init(name: name, age: age)
self.nickName = nickName
}
}
Failable Initializer (์คํจ๊ฐ๋ฅํ ์ด๋์ ๋ผ์ด์ )
์ด๋์
๋ผ์ด์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋๋ ์ด๊ธฐ๊ฐ์ด ์๋ชป๋ ๊ฒฝ์ฐ ์ธ์คํด์ค ์์ฑ์ ์คํจํ ์ ์์
์คํจ ๊ฐ๋ฅ์ฑ์ ๋ดํฌํ ์ด๋์
๋ผ์ด์ ๋ฅผ ์คํจ๊ฐ๋ฅํ ์ด๋์
๋ผ์ด์ ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์คํจ ๊ฐ๋ฅํ ์ด๋์
๋ผ์ด์ ๋ ์คํจํ์ ๋ nil์ ๋ฐํํด์ฃผ๋ฏ๋ก ๋ฐํ ํ์
์ด ์ต์
๋๋ก ์ง์ ๋๋ค. init? ํค์๋๋ฅผ ์ด์ฉํด ๊ตฌํ
class Dog {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
class Puppy: Dog {
var owner: String
var address: String
init?(owner: String, address: String) {
guard owner.count < 5 else {
return nil
}
self.owner = owner
self.address = address
super.init(name: "๋ฉ๋ฉ์ด", age: 1)
}
}
์์ ๊ฐ์ด ํน์ ์กฐ๊ฑด์ ๋ถํฉํ์ง ์์ผ๋ฉด nil์ ๋ฐํํ๊ณ , ํด๋์ค ์ธ์คํด์ค์ ์์ฑ์ ๋ง์ ์ ์๋ค.
๋์ด๋์ ๋ผ์ด์ deinit
๋์ด๋์
๋ผ์ด์ ๋ ์ด๋์
๋ผ์ด์ ์ ๋ฐ๋ ์ญํ
deinit์ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ ์์ ์ ํธ์ถ๋๋ค.
์ด๋ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ ์์ ์ ์๋์ผ๋ก ํธ์ถ๋๊ธฐ ๋๋ฌธ์ ์ง์ ํธ์ถํ ์ ์์
์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ ์์ ์ ARC(Automatic Reference Counting) ์ ๊ท์น์ ๋ฐ๋ผ ๊ฒฐ์ ๋จ
โ ๏ธ ๋์ด๋์
๋ผ์ด์ ๋ ํด๋์ค์ ์ธ์คํด์ค์๋ง ๊ตฌํํ ์ ์์ผ๋ฉฐ ๋งค๊ฐ๋ณ์๋ฅผ ์ง๋ ์ ์๋ค!
class PersonE {
var name: String
var pet: Puppy?
var child: PersonC
init(name: String, child: PersonC) {
self.name = name
self.child = child
}
// ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ ์์ ์ ์๋ ํธ์ถ
deinit {
if let petName = pet?.name {
print("\(name)๊ฐ \(child.name)์๊ฒ \(petName)๋ฅผ ์ธ๋ํฉ๋๋ค")
self.pet?.owner = child
}
}
}
var donald: PersonE? = PersonE(name: "donald", child: jenny)
donald?.pet = happy
donald = nil // donald ์ธ์คํด์ค๊ฐ ๋์ด์ ํ์์์ผ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค
// Prints: donald๊ฐ jenny์๊ฒ happy๋ฅผ ์ธ๋ํฉ๋๋ค
Initializer Delegation
<๊ณต์ ๋ฌธ์ ๋ฒ์ญ>
์ด๋์ ๋ผ์ด์ ๋ ๋ค๋ฅธ ์ด๊ธฐํ ์ด๋์ ๋ผ์ด์ ๋ฅผ ํธ์ถํ์ฌ ์ธ์คํด์ค ์ด๊ธฐํ์ ์ผ๋ถ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
Initializer Delegation๋ฅผ ํตํด ์ฌ๋ฌ ์ด๋์ ๋ผ์ด์ ๊ฐ์ ์ค๋ณต๋ ์ฝ๋๋ฅผ ํผํ ์ ์์ต๋๋ค.
Value Type์์์ Initializer Delegation
๊ฐ ํ์ ์์๋ ์์์ ๊ฐ๋ ์ด ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋จํจ
initializer๋ฅผ ์ ์ํ ๋ self.init()์ ์ด์ฉํด์ ๋ค๋ฅธ initializer๋ฅผ ํธ์ถํ์ฌ ์ค๋ณต๋ ์ฝ๋๋ฅผ ํผํ ์ ์์
struct Point {
var x: Double
var y: Double
init(x: Double, y: Double) {
self.x = x
self.y = y
}
init(value: Double) {
self.x = value
self.y = value
}
}
var zero: Point = Point(x: 0.0, y: 0.0)
zero = Point(value: 0.0)
Initializer Delegation์ ์ด์ฉํด ์ค๋ณต๋ ์ฝ๋๋ฅผ ์ญ์ ํ ์ ์์ (์์ ๊ฐ์ ๊ธฐ๋ฅ)
struct Point {
var x: Double
var y: Double
init(x: Double, y: Double) {
self.x = x
self.y = y
}
init(value: Double) {
self.init(x: value, y: value)
}
}
var zero: Point = Point(value: 0.0)
Reference Type์์์ Initializer Delegation
Swift๋ class์ initializer ๊ฐ์ delegation์ ๋ํด ์ธ ๊ฐ์ง ๊ท์น์ ์ ํด์ค
1. designated Initializer๋ ๋ฐ๋์ superclass์ designated initalizer๋ฅผ ํธ์ถํด์ผ ํ๋ค.(delegation up)
2. convenience initializer๋ ๊ฐ์ ํด๋์ค์ ๋ค๋ฅธ ์ด๋์ ๋ผ์ด์ ๋ฅผ ํธ์ถํด์ผ ํ๋ค. (delegation across)
3. convenience initializer๋ 2๋ฒ ๋ฃฐ์ ์ง์ผ์ ๋ค๋ฅธ ์ด๋์ ๋ผ์ด์ ๋ฅผ ํธ์ถํ๋๋ผ๋ ๊ฒฐ๊ตญ์ designated initializer๋ฅผ ํธ์ถํด์ผ ํ๋ค. (delegation across)
์์ ์ฝ๋
class BaseTableViewCell: UITableViewCell {
// MARK: init
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setCommonAttributes()
setStyle()
setLayout()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
/// ๊ธฐ๋ณธ attributes ์ค์ ๋ฉ์๋
private func setCommonAttributes() {
selectionStyle = .none
}
func setStyle() { }
func setLayout() { }
}
final class SettingListTableViewCell: BaseTableViewCell {
// MARK: Properties
private let titleLabel = UILabel()
// MARK: UI
override func setStyle() {
titleLabel.do {
$0.font = .pretendardM(16)
$0.textColor = .grayBlack
}
}
override func setLayout() {
contentView.addSubview(titleLabel)
titleLabel.snp.makeConstraints {
$0.top.leading.bottom.equalToSuperview().inset(16)
}
}
// MARK: Custom Methods
func setData(title: String) {
titleLabel.text = title
}
}
Swift ์ด๊ธฐํ ๊ท์น์ ๋ฐ๋ผ SettingListTableViewCell์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ์๋์ผ๋ก ์ํผ ํด๋์ค(BaseTableViewCell)์ designated initializer๊ฐ ๋จผ์ ํธ์ถ๋๊ธฐ ๋๋ฌธ์ ๋ช ์์ ์ผ๋ก init์ ํธ์ถํ์ง ์์๋ ๊ณตํต ์์ฑ์ด ์ค์ ๋๊ณ , ์คํ์ผ๋ง ๋ฐ ๋ ์ด์์ ๋ฉ์๋๊ฐ ํธ์ถ๋์ด ์ด๊ธฐํ ๊ณผ์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ํ๋๋ค. Swift์์ ์ด ๊ณผ์ ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ์ฌ ์ด๊ธฐํ๊ฐ ํ์ ํด๋์ค๋ถํฐ ์์๋์ด ์์ ์ฒด์ธ์ ๋ฐ๋ผ ์ฌ๋ผ๊ฐ๋๋ก ๋ณด์ฅํจ
์ฐธ๊ณ ๋ฌธ์: The Swift Programming Language - Initialization
Tuist
Tuist๋?
Tuist๋ Apple ํ๋ซํผ์ฉ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ์ ๋ณต์ก์ฑ์ ํด๊ฒฐํ๋๋ก ์ค๊ณ๋ ๋ช ๋ น์ค ์ธํฐํ์ด์ค(CLI)์ ๋๋ค. (๊ณต์๋ฌธ์ ๋ฒ์ญ)
์ฆ, Tuist๋ Xcode ํ๋ก์ ํธ ์์ฑ๊ณผ ์ ์ง ๋ฐ ๊ด๋ฆฌ๋ฅผ ํธ๋ฆฌํ๊ฒ ํ๋ ๊ฒ์ ๋์์ฃผ๋ CLI ๋๊ตฌ
Xcode ํ๋ก์ ํธ ์์ฑ ๋ฐ ๊ด๋ฆฌ ๋๊ตฌ๋?
.xcodeproj๋ฅผ ๊นํ๋ธ์ ์ฌ๋ ค๋๊ณ ํ์ ์ ํ ๋, ํ์ผ์ ์ถ๊ฐํ๊ฑฐ๋ ์์ ํ๊ฒ ๋๋ฉด ๋ค๋ฅธ ์ฌ๋๊ณผ .pbxprojํ์ผ์ ๋ด์ฉ์ด ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ git conflict๊ฐ ๋ฐ์. ์ด๋ฅผ ์๋ฐฉํ๊ธฐ ์ํด ์ฝ๋์ ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌ ํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด ํ๋ก์ ํธ ๊ด๋ฆฌ ํด. ๋ํ, ๋ชจ๋ํ๋ฅผ ํ ๋ ๋ชจ๋ ๊ตฌ์กฐ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ํธ๋ฆฌํ๋ค๋ ์ด์ ์ด ์์. ๋ํ์ ์ผ๋ก XcodeGen, Tuist ๋ฑ์ด ์๋ค!
Why Tuist?
Tuist์ XcodeGen์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ XcodeGen์ .yml ๋๋ json ํ์ผ์ ํตํด ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ์ง๋ง Tuist๋ swift ํ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
Tuist๋ฅผ ๋์ ํด์ผ ํ๋ ์ด์
Tuist๋ฅผ ๋์ ํ๋ฉด ๊ตฌ์ฒด์ ์ผ๋ก ๋ญ๊ฐ ์ข์๊น???
์นด์นด์ค๋ฑ ํฌ iOS ํ๋ก์ ํธ์ ๋ชจ๋ํ ์ฌ์ : Tuist๋ฅผ ํ์ฉํ ๋ชจ๋ ์ํคํ ์ฒ ์ค๊ณ ์ฌ๋ก (if kakao ์ธ์ )์ ์ฐธ๊ณ ํ๋ค!
https://if.kakao.com/2022/session/88
1. ํ์ํ ์ฝ๋์ ๋ชจ๋๋ง ์ฆ๋ถ ๋น๋ ํ ์ ์์ด ๋น ๋ฅธ ๋น๋๊ฐ ๊ฐ๋ฅํด์ง
๋ชจ๋ ๋จ์๋ก ๋ฐ๋ชจ ์ฑ์ ๋ง๋ค์ด์ ํ์ํ ๊ธฐ๋ฅ๋ง ํ ์คํธ ๊ฐ๋ฅ
์ฆ๋ถ ๋น๋๊ฐ ๊ฐ๋ฅํด์ง๋ฉด ํ ์คํธ ์๊ฐ ๋ํ ๋นจ๋ผ์ง
2. ๋ถํ์ํ ์์กด์ฑ ์ ๊ฑฐ ๊ฐ๋ฅ
๋ถํ์ํ ์์กด์ฑ์ ์ ๊ฑฐํจ์ผ๋ก์จ ์ ์ฒด์ ์ธ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์์
3. ์์กด์ฑ ๊ทธ๋ํ ์์ฑ ๊ฐ๋ฅ
ํ๋ก์ ํธ ๊ตฌ์กฐ ๊ฐ์ํ ๊ฐ๋ฅํด์ ธ ๊ฑฐ์์ ์ธ ๊ด์ ์์ ํ๋ก์ ํธ ์์ฑ ๋ฐ ๊ด๋ฆฌ๊ฐ๋ฅ
๋ชจ๋ ๋ถ๋ฆฌ๊ฐ ์ด๋ ค์ด ์ด์ ?
1. ํ๋ก์ ํธ, ํ๋ ์์ํฌ๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๊ณผ์ ์์ ์ค์๊ฐ ๋ฐ์ํ ์ ์์
(ํ ํ๋ก์ ํธ์ ๋์ /์ ์ ํ๋ ์์ํฌ๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ค๋ฉด ์ด๋ฅผ ๋ชจ๋ ์๋์ผ๋ก ๊ด๋ฆฌํ์ ๋ ๋ง์ฝ ๋์ ํ๋ ์์ํฌ๋ฅผ ์ค์๋ก embed ํ์ง ์์๋ค? ๋ฐํ์ ์๋ฌ ๋ฐ์ํจ)
2. SwiftPM ์ ์ฝ์ฌํญ
Configuration์ debug, release๋ง ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ํ๊ฒฝ(develop, test, production ๋ฑ)์ configuration ์ค์ ์ ์ด๋ ค์
์์ ์ด๋ ค์ด ์ ๋ค์ ํด๊ฒฐํด์ค ์ ์๋ ๋๊ตฌ๊ฐ Tuist
ํ๋ก์ ํธ์ ์ ์ฉํด๋ณด๊ณ ์ ์ฉ๊ธฐ๋ ์ฅ์ , ๋จ์ ์ ๋ฆฌํด์ ๋ฐ๋ก ๊ธ์ ์จ๋ณด๊ฒ ์!!!
[์ฐธ๊ณ ์๋ฃ]
https://baegteun.tistory.com/2
'๐ ๊ธฐ๋ก > TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL] 20231129 (1) | 2023.11.29 |
---|---|
[TIL] 20231128 (3) | 2023.11.29 |
[TIL] 20231123 (1) | 2023.11.23 |
[TIL] 20231122 (0) | 2023.11.22 |
[TIL] 20231121 (0) | 2023.11.21 |