Hello Swift Final 5/5 - Structures and Classes
description
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