Data Model

Data Model, Structure와 Class

Initializer

init의 구체적인 내용은 스위프트 도큐멘테이션을 참조할 수 있다. Initializer Swift Document Official Resources

  1. Setting Initial Values for Stored Properties
  2. Customizing Initialization
  3. Default Initializers
  4. Initializer Delegation for Value Types : Designated Initializer, Convenience Initializer
  5. Class Inheritance and Initialization
  6. Failable Initializers
  7. Required Initializers
  8. Setting a Default Property Value with a Closure or Function

Struct의 Memberwise Initializer

Custom Initializer

struct Celsius {
    var temperatureInCelsius: Double
    init(fromFahrenheit fahrenheit: Double) {
        temperatureInCelsius = (fahrenheit - 32.0) / 1.8
    }
    init(fromKelvin kelvin: Double) {
        temperatureInCelsius = kelvin - 273.15
    }
    init(_ celsius: Double) {
        temperatureInCelsius = celsius
    }
}

let bodyTemperature = Celsius(37.0)
// bodyTemperature.temperatureInCelsius is 37.0

Designated Initializer

Convenience Initializer

Rule 1

Rule 2

Rule 3

A simple way to remember

Safety Check

convenience init(name: String) {
    // 자신의 designated initializer 먼저 호출
    self.init(frame: CGRect(x:0,y:0,width:10,height:10))
    // designated initializer 먼저 호출한뒤 SomeView의 프로퍼티 초기화
    self.name = name
}

Required Initializer

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

Class 상속시 초기화

Sample Code

import UIKit
class SomeView: UIView {
	
	// SomeView의 프로퍼티
	var name:String
	    
	// SomeView의 부모 class가 요구하는 required initializer
	required init?(coder aDecoder: NSCoder) {
	    fatalError("init(coder:) has not been implemented")
	}
	    
	// designated initializer
	override init(frame: CGRect) {
	    // SomeView의 프로퍼티를 초기화하는 동시에,
	    self.name = ""
	    // 상속을 받았으므로 부모 클래스의 Designated initializer를 호출하며 frame 초기화
	    super.init(frame: frame)
	}
	    
	// convenience initializer: name 값을 받으면서 초기화 하기 위함
	convenience init(name: String) {
	    // 자신의 designated initializer 호출
	    self.init(frame: CGRect(x:0,y:0,width:10,height:10))
	    // SomeView의 프로퍼티 초기화
	    self.name = name
	}

}

Mutating func

Deinit

Failable Initializers

struct Animal {
    let species: String
    init?(species: String) {
        if species.isEmpty { return nil }
        self.species = species
    }
}