Upload
hyun-jin-moon
View
364
Download
1
Embed Size (px)
Citation preview
사용자 정의 초기화 - 초기화 파라메터
struct Celsius {
var temperatureInCelsius: Double = 0.0
init(fromFahrenheit fahrenheit: Double) {
temperatureInCelsius = (faherenheit - 32.0)/1.8
}
}
사용자 정의 초기화 - 지역 파라메터
struct Color {
let red = 0.0, green = 0.0, blue = 0.0
init(red: Double, green: Double, blue: Double) {
self.red = red
self.green = green
self.blue = blue
}
}
사용자 정의 초기화 - 외부 파라메터
let magenta = Color(red: 1.0, green: 0.0, blue: 1.0)
let veryGreen = Color(0.0, 1.0, 0.0)
init 의파라메터는기본적으로지역파라메터 + 외부파라메터 이다.
class SurveyQuestion {
var text: String
var response: String?
init(text: String) {
self.text = text
}
func ask() {
println(text)
}
}
옵셔널 속성 타입
let cheeseQuestion =
SurveyQuestion(text: “Do you like
cheese?”)
cheeseQuestion.ask()
cheeseQuestion.response = “Yes, I do
like cheese.”
class SurveyQuestion {
let text: String
var response: String?
init(text: String) {
self.text = text
}
func ask() {
println(text)
}
}
초기화 과정중에 상수 속성을 변경하기
let cheeseQuestion =
SurveyQuestion(text: “How about
beets??”)
cheeseQuestion.ask()
cheeseQuestion.response = “I also
like beets.”
기본 초기자
class ShoppingListItem {
var name: String?
var quantity = 1
var purchased = false
}
var item = ShoppingListItem()
모든속성은기본값을가져야합니다.
옵셔널은자동기본값으로 nil을받습니다.
구조체 타입의 멤버 단위 초기화
struct Size {
var width = 0.0, height = 0.0
}
let twoByTwo = Size(width: 2.0,
height: 2.0)
모든속성에기본값이있고,
사용자정의초기자가없으면=> 구조체타입은자동으로멤버단위초기자를가진다.
값타입 = 구조체, 열거자
값 타입의 초기자 대리자
struct Size {
var width = 0.0, height = 0.0
}
struct Point {
var x = 0.0, y = 0.0
}
값 타입의 초기자 대리자
struct Rect {
var origin = Point()
var size = Size()
init() {}
init(origin: Point, size:Size) {
self.origin = origin
self.size = size
}
init(center: Point, size:Size) {
let originX = center.x - (size.width /2)
let originY = center.y - (size.height /2)
self.init(origin: Point(x: originX, y: originY), size: size)
}
}
정사각형을그리는방법은 3가지가있다.
1. (0, 0)에위치하는크기 0 짜리정사각형2. (x, y)에위치하는크기 n 짜리정사각형3. (x, y)를중심으로하는크기 n짜리정사각형
이초기화시나리오이다. 3번째초기자에서, 2번째초기자를호출또는대리한다.
클래스 상속과 초기화
지정 초기자주 초기자
모든속성을완전히초기화+
적절한부모클래스 초기자호출
모든클래스는반드시하나이상의지정초기자를가져야한다.
편의초기자부초기자
같은클래스내의지정초기자를호출하는초기자
호출하는지정초기자의몇몇파라메터를기본으로하는초기자
특정용도나입력값타입에대한클래스인스턴스를만드는초기자
안전 점검 1부모 클래스의초기자를위임하기전에, 내 클래스의 속성이초기화되었는지확인한다.
안전 점검 2지정 초기자는상속받은속성에값을할당하기전에부모클래스의초기자를수행해야합니다. (값이부모클래스의초기화중에덮어씌워진다.)
안전점검 3편의초기자는속성에값을할당하기전에다른초기자를대리수행해야합니다. 그렇지않으면편의초기자가할당한값은지정초기자에의해덮어씌워집니다.
안전점검 4초기자는인스턴스메소드를호출할수없습니다.
초기화첫단계가끝나기전에는 self도참조할수없습니다.
두 단계초기화
초기화중간에뭔가수정하기위해서, 부모클래스와같은초기자를가진자식클래스가 필요 할때, 자식클래스에같은초기자를 오버라이딩해서구현 할수있습니다.
오버라이딩하는초기자가지정초기자라면, 오자식클래스에서구현체를오버라이드 하고, 오버라이딩 하는버전에서 부모버전의초기자를호출하도록 할수있습니다.
초기자 상속과 오버라이딩
편의초기자는 convenience를 사용합니다.
convenience init(parameters) {
statements
}
클래스의지정초기자는값타입을위한단순초기자와같은방식으로작성한다.
init(parameters) {
statements
}
지정 초기자, 편의초기자의 문법
class Food {
var name: String
init(name: String) {
self.name = name
}
convenience init() {
self.init(name: “[Unnamed]”)
}
}
지정 초기자와 편의 초기자 실습
class RecipeIngredient: Food {
var quantity: Int
init(name:String, quantity: Int) {
self.quantity = quantity
super.init(name: name)
}
convenience init(name: String) {
self.init(name: name, quantity: 1)
}
}
지정 초기자와 편의 초기자 실습
class RecipeIngredient: Food {
var quantity: Int
init(name:String, quantity: Int) {
self.quantity = quantity
super.init(name: name)
}
convenience init(name: String) {
self.init(name: name, quantity: 1)
}
}
지정 초기자와 편의 초기자 실습
class RecipeIngredient: Food {
var quantity: Int
init(name:String, quantity: Int) {
self.quantity = quantity
super.init(name: name)
}
convenience init(name: String) {
self.init(name: name, quantity: 1)
}
}
지정 초기자와 편의 초기자 실습
let oneMysteryItem =
RecipeIngreidnet()
let oneBacon =
RecipeIngredient(name:
“Bacon”)
let sixEggs =
RecipeIngredient(name: “Eggs”,
quantity: 6)
지정 초기자와 편의 초기자 실습
class ShoppingListItem: RecipeIngredient {
var purchased = false
var description: String {
var output = “\(quantity) x
\(name.lowercaseString)”
output += purchased ? “V” : “X”
return output
}
}
지정 초기자와 편의 초기자 실습