Hello Swift Final 5/5 - Structures and Classes

Post on 27-Aug-2014

253 views 4 download

Tags:

description

How to use structure and class in Swift? Please check this slide.

Transcript of Hello Swift Final 5/5 - Structures and Classes

Welcome to Swift 5/5 Final

class Counter { var count = 0 func increment() { count++ }}

•Structure•Classes

다룰 내용

Same things Structures and Classes

•값을 저장하는 프로퍼티를 정의

•기능을 제공하는 메소드를 정의

•Subscript를 이용하여 값에 접근하도록 Subscript를 정의

•초기상태를 설정하기 위한 생성자를 정의

•기본 구현을 바탕으로 기능을 확장

•프로토콜을 이용하여 표준 기능을 제공하도록함

Additional capabilities at Classes

•상속

•런타임에 타입을 해석하고, 체크하여 캐스팅(다형성)

•클래스의 인스턴스를 소멸

•하나 이상의 참조 카운팅

Definition Classes and Structure Syntax

class FirstClass { }

class FirstStructure { }

Definition Classes and Structure Syntax

struct FirstStructure { }

class FirstClass { }

Definition Classes and Structure Syntax

struct FirstStructure { var width = 0 var height = 0}

class FirstClass { var first = FirstStructure() var name = "Cody"}

Using Classes and Structure

struct FirstStructure { var width = 0 var height = 0}

class FirstClass { var first = FirstStructure() var name = "Cody"}

var classInstance = FirstClass()var structInstance = FirstStructure()

Access to Properties

struct FirstStructure { var width = 0 var height = 0}

class FirstClass { var first = FirstStructure() var name = "Cody"}

var classInstance = FirstClass()var structInstance = FirstStructure()

structInstance.widthclassInstance.name

Automatically generated memberwise init

struct FirstStructure { var width = 0 var height = 0}

class FirstClass { var first = FirstStructure() var name = ""}

var structInstance = FirstStructure(width:100,height:200)

var classInstance = FirstClass(name:"Gwangho")

Automatically generated memberwise init

struct FirstStructure { var width = 0 var height = 0}

class FirstClass { var first = FirstStructure() var name = ""}

var structInstance = FirstStructure(width:100,height:200)

var classInstance = FirstClass(name:"Gwangho")

// 이건 참 편한 문법인것 같은데 구조체만 됩니다. class는 안되요.

Extra argument 'name' in call'

Copied value type in Structure

struct FirstStructure { var width = 0 var height = 0}

var instance1 = FirstStructure(width:100,height:200)var instance2 = instance1instance2.width = 300

instance1.width // 100instance2.width // 300

But Classes are Reference Types

class FirstClass { var name = ""}

var instance1 = FirstClass()instance1.name = "Daum"var instance2 = instance1instance2.name = "KAKAO"

instance1.name // KAKAOinstance2.name // KAKAO

Identity Operators

class FirstClass { var name = ""}

var instance1 = FirstClass()var instance2 = instance1

if instance1==instance2 { "Equal"}

Identity Operators

class FirstClass { var name = ""}

var instance1 = FirstClass()var instance2 = instance1

if instance1==instance2 { "Equal"}

Could not find an overload for '==' that accepts the supplied arguments

Identity Operators

class FirstClass { var name = ""}

var instance1 = FirstClass()var instance2 = instance1

if instance1===instance2 { "Equal"}

Identity Operators

class FirstClass { var name = ""}

var instance1 = FirstClass()var instance2 = instance1

if instance1!==instance2 { "Not Equal to"}

Choosing Between Classes and Structures

•Reference Type•Value type

Copy Behavior in Dicrionary

var ages = ["Peter": 23, "Wei": 35, "Anish": 65, "Katya": 19]var copiedAges = ages

ages["Peter"] = 32copiedAges["Peter"]

Copy Behavior in Array

var a = [1, 2, 3]var b = a

a[0] = 10

ab

Copy Behavior in Array

var a = [1, 2, 3]var b = a

a[0] = 10

a // [10,2,3]b // [10,2,3]

a += 4

a // [10,2,3,4]b // [10,2,3]

Unshare() in Array

var a = [1, 2, 3]var b = a

a.unshare()a[0] = 10

a // [10,2,3]b // [1,2,3]

Compare two Array

var a = [1, 2, 3]var b = a

a.unshare()a[0] = 10

a // [10,2,3]b // [1,2,3]

@lazy syntax

class DataImporter { var fileName = "data.txt"}

class DataManager { @lazy var importer = DataImporter() var data = String[]()}

let manager = DataManager()manager.data += "Some data"manager.data += "Some more data"

manager // importer is nilmanager.importer // Now, importer is not nil

Properies

struct People { var hasClass : Bool = false var isStudent : Bool { get{ return hasClass } set(student) { hasClass = student } }}

var codyInstance = People()codyInstance.isStudentcodyInstance.isStudent = true

Shorthand Setter DeclarationProperies

struct People { var hasClass : Bool = false var isStudent : Bool { get{ return hasClass } set { hasClass = newValue } }}

var codyInstance = People()codyInstance.isStudentcodyInstance.isStudent = true

Read-Only Properies

struct People { var hasClass : Bool = false var isStudent : Bool { return hasClass }}

var codyInstance = People()codyInstance.isStudentcodyInstance.isStudent = trueCannot assign to 'isStudent' in 'codyInstance'

Property Observers

struct People { var hasClass : Bool = false var isStudent : Bool = false { willSet { "will change" } didSet { "already changed" } }}

var codyInstance = People()codyInstance.isStudent = true

Global and Local

// 지금까지 살펴본 내용은 글로벌 변수나, 로컬 변수 모두 적용이 가능합니다.

Type Property

enum SomeEnum { static var typeValue : Int { return 100 }}SomeEnum.typeValuestruct SomeStructure { static var typeValue : Int { return 100 }}SomeStructure.typeValueclass SomeClass { static var typeValue : Int { return 100 }}SomeClass.typeValueStatic properties are only allowed within structs and enums; use 'class' to declar...

Type Property

enum SomeEnum { static var typeValue : Int { return 100 }}SomeEnum.typeValuestruct SomeStructure { static var typeValue : Int { return 100 }}SomeStructure.typeValueclass SomeClass { class var typeValue : Int { return 100 }}SomeClass.typeValue

Methods

class Counter { var count = 0 func increment() { count++ }}

var myCounter = Counter();myCounter.increment() // 1myCounter.increment() // 2myCounter.increment() // 3

Local and External Parameter Names

class Counter { var count = 0 func increment(number:Int,numberTimes:Int) { count += number*numberTimes }}

var myCounter = Counter();

myCounter.increment(10,numberTimes:20)

Local and External Parameter Names

class Counter { var count = 0 func increment(number:Int,#numberTimes:Int) { count += number*numberTimes }}

var myCounter = Counter();

myCounter.increment(10,numberTimes:20)

The “self” Property

class Counter { var count = 0 func increment(number:Int,numberTimes:Int) { self.count += number*numberTimes }}

var myCounter = Counter();

myCounter.increment(10,numberTimes:20)

Mutating Method

class Counter { var count = 0 func increment(number:Int,numberTimes:Int) { self.count += number*numberTimes }}

var myCounter = Counter();

myCounter.increment(10,numberTimes:20)

Subscripts

class Counter { var count = 0 func increment() { self.count++ } subscript(index:Int)->Int { return count*index }}

var myCounter = Counter();myCounter.increment() // 1myCounter[10] // 1*10==10

Subscripts

class Counter { var count = 0 func increment() { self.count++ } subscript(index1:Int, index2:Int)->Int { return count*index1*index2 }}

var myCounter = Counter();myCounter.increment() // 1myCounter[10,10] // 1*10*10==100

Inheritance : Implements Base Class

class Vehicle { var numberOfWheels: Int func description() -> String { return "\(numberOfWheels) wheels; up to" } init() { numberOfWheels = 0 }}

Inheritance : Subclassing

class SomeClass : SomeSuperClass { }

Inheritance : Subclassing

class Vehicle { var numberOfWheels: Int func description() -> String { return "\(numberOfWheels) wheels; up to" } init() { numberOfWheels = 0 }}

class Bicycle : Vehicle { init() { super.init() numberOfWheels = 2 }}

Inheritance : Overriding

class Vehicle { var numberOfWheels: Int func description() -> String { return "\(numberOfWheels) wheels; up to" } init() { numberOfWheels = 0 }}

class Bicycle : Vehicle { override func description() -> String { return super.description()+" 헬맷착용 생활하!" } init() { super.init() numberOfWheels = 2 }}

Inheritance : Override Property

class Bicycle : Vehicle { override var numberOfWheels: Int { get { return super.numberOfWheels } set { super.numberOfWheels = min(newValue, 0) } } override func description() -> String { return super.description()+" 헬맷착용 생활하!" } init() { super.init() numberOfWheels = 2 }}

Inheritance : Preventing Overrides

class Vehicle { @final var numberOfWheels: Int func description() -> String { return "\(numberOfWheels) wheels; up to" } init() { numberOfWheels = 0 }}

Initializer and Deinitializer

class Player { var coinsInPurse: Int init(coins: Int) { coinsInPurse = coins } func winCoins(coins: Int) { coinsInPurse += coins } deinit { coinsInPurse = 0 }}

감사합니다.

let writer = ["Cody":"Yun"]

Could not find an overload for '==' that accepts the supplied arguments