35
swift 0x0e initialization 문현진([email protected])

Swift 0x0e 초기화

Embed Size (px)

Citation preview

swift 0x0e

initialization

문현진([email protected])

초기자

init

초기자

struct Fahrenheit {

var temperature: Double

init() {

temperature = 32.0

}

}

기본 속성 값

struct Fahrenheit {

var temperature = 32.0

}

사용자 정의 초기화 - 초기화 파라메터

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 Phase

해당 클래스가가지는저장속성에초기값을 할당한다.

2 Phase

클래스인스턴스를 사용할준비가되기전까지 속성 값을변경한다.

두 단계초기화

안전 점검 1부모 클래스의초기자를위임하기전에, 내 클래스의 속성이초기화되었는지확인한다.

안전 점검 2지정 초기자는상속받은속성에값을할당하기전에부모클래스의초기자를수행해야합니다. (값이부모클래스의초기화중에덮어씌워진다.)

안전점검 3편의초기자는속성에값을할당하기전에다른초기자를대리수행해야합니다. 그렇지않으면편의초기자가할당한값은지정초기자에의해덮어씌워집니다.

안전점검 4초기자는인스턴스메소드를호출할수없습니다.

초기화첫단계가끝나기전에는 self도참조할수없습니다.

두 단계초기화

Phase 1

두 단계초기화

Phase 2

두 단계초기화

swift의자식클래스는 기본적으로부모클래스의초기자를상속받지않습니다.

(=! object-C)

초기자 상속과 오버라이딩

초기화중간에뭔가수정하기위해서, 부모클래스와같은초기자를가진자식클래스가 필요 할때, 자식클래스에같은초기자를 오버라이딩해서구현 할수있습니다.

오버라이딩하는초기자가지정초기자라면, 오자식클래스에서구현체를오버라이드 하고, 오버라이딩 하는버전에서 부모버전의초기자를호출하도록 할수있습니다.

초기자 상속과 오버라이딩

Rule 1자식클래스가지정초기자를정의하지않는다.

Rule 2자식클래스가부모클래스의모든지정초기자를구현한다.

초기자 자동 상속

편의초기자는 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

}

}

지정 초기자와 편의 초기자 실습

class SomeClass {

let someProperty: SomeType = {

return someValue}()

}

클로저나 함수로기본 속성 값을설정하기

클로저나 함수로기본 속성 값을설정하기

클로저나 함수로기본 속성 값을설정하기