enum enum enum Multimedia Type case none case

  • Slides: 119
Download presentation
enum

enum

enum //열거형 생성 enum Multimedia. Type{ case none case text case audio case movie

enum //열거형 생성 enum Multimedia. Type{ case none case text case audio case movie case picture } var type : Multimedia. Type = Multimedia. Type. text print(type) text 4

enum Multimedia. Type: Int{ case none case text case audio case movie = 10

enum Multimedia. Type: Int{ case none case text case audio case movie = 10 case picture func display() { switch self { case. none: print("타입이 없습니다. ") case. text: print("문자열이 저장되어 있습니다. ") default: print("저장된 데이터가 없습니다. ") } } } //열거형 이름을 생략하고 대입 var type : Multimedia. Type =. text print(type) //실제 저장된 값을 출력 print(type. raw. Value) print(Multimedia. Type. picture. raw. Value) //메소드 호출 type. display() text 1 11 문자열이 저장되어 있습니다. 6

enum Multimedia. Type: String, Case. Iterable{ case none = "없음" case text = "문서"

enum Multimedia. Type: String, Case. Iterable{ case none = "없음" case text = "문서" case audio = "음성" case movie = "영상" case picture = "이미지" } //raw. Value를 이용한 초기화 var type : Multimedia. Type? = Multimedia. Type(raw. Value: "음성") print(type!. raw. Value) print() 음성 none text audio movie picture //열거형 순회 for i in Multimedia. Type. all. Cases{ print(i) } 7

enum //연관값 이용하기 enum Barcode { case upc(Int, Int) case qr. Code(String) } UPC:

enum //연관값 이용하기 enum Barcode { case upc(Int, Int) case qr. Code(String) } UPC: 8, 85909, 51226, 3. QR code: ABCDEFGHIJKLMNOP. var product. Barcode = Barcode. upc(8, 85909, 51226, 3) switch product. Barcode { case. upc(let number. System, let manufacturer, let product, let check): print("UPC: (number. System), (manufacturer), (product), (check). ") case. qr. Code(let product. Code): print("QR code: (product. Code). ") } product. Barcode =. qr. Code("ABCDEFGHIJKLMNOP") switch product. Barcode { case. upc(let number. System, let manufacturer, let product, let check): print("UPC: (number. System), (manufacturer), (product), (check). ") case. qr. Code(let product. Code): print("QR code: (product. Code). ") } 8

enum v Enum 연관 값을 다른 Enum을 사용하는 것을 Recursive Enumerations 이라고 하고 case

enum v Enum 연관 값을 다른 Enum을 사용하는 것을 Recursive Enumerations 이라고 하고 case 앞에 indirect를 붙임 9

enum //열거형의 연관 값에 열거형 사용 enum Arithmetic. Expression { case number(Int) indirect case

enum //열거형의 연관 값에 열거형 사용 enum Arithmetic. Expression { case number(Int) indirect case addition(Arithmetic. Expression, Arithmetic. Expression) indirect case multiplication(Arithmetic. Expression, Arithmetic. Expression) } let let 18 five = Arithmetic. Expression. number(5) four = Arithmetic. Expression. number(4) sum = Arithmetic. Expression. addition(five, four) product = Arithmetic. Expression. multiplication(sum, Arithmetic. Expression. number(2)) func evaluate(_ expression: Arithmetic. Expression) -> Int { switch expression { case let. number(value): return value case let. addition(left, right): return evaluate(left) + evaluate(right) case let. multiplication(left, right): return evaluate(left) * evaluate(right) } } print(evaluate(product)) 10

클래스 class Person{ var name = "noname" var hometown = "서울" var age =

클래스 class Person{ var name = "noname" var hometown = "서울" var age = 0 init(){} init (name: String, hometown: String, age: Int){ self. name = name self. hometown = hometown self. age = age } func disp(){ print("이름은 ₩(name)이고 고향은 ₩(hometown) 나이는 ₩(age)") } } var p 1 = Person() p 1. disp() var p 2 = Person(name: "박문석", hometown: "만재도", age: 45) p 2. disp() 21

클래스 v 구조체와 클래스의 차이 //구조체 선언 struct Struct. Point{ var x = 0.

클래스 v 구조체와 클래스의 차이 //구조체 선언 struct Struct. Point{ var x = 0. 0 var y = 0. 0 func disp(){ print("Struct. Point(x: (x), y: (y))") } } //클래스 선언 class Class. Point{ var x = 0. 0 var y = 0. 0 func disp(){ print("Class. Point(x: (x), y: (y))") } } 23

클래스 Struct. Point(x: 0. 0, y: 0. 0) Struct. Point(x: 100. 0, y: 200.

클래스 Struct. Point(x: 0. 0, y: 0. 0) Struct. Point(x: 100. 0, y: 200. 0) ============== Class. Point(x: 100. 0, y: 200. 0) 25

프로퍼티 class Rect{ //저장 프로퍼티 var x = 0 var y = 0 var

프로퍼티 class Rect{ //저장 프로퍼티 var x = 0 var y = 0 var width = 0 var height = 0 } //연산 프로퍼티 var center : (Int, Int){ //center를 요청하면 필요한 순간에 계산 get{ return ((x+width)/2, (y+height)/2) } //center를 설정하면 x, y를 조정 set(value){ x = (value. 0 - width/2) y = (value. 1 - height/2) } } 29

프로퍼티 var rect = Rect() rect. width = 100 rect. height = 200 print(rect.

프로퍼티 var rect = Rect() rect. width = 100 rect. height = 200 print(rect. center) rect. center = (90, 170) print(rect. x, rect. y) (100 , 50) 70 40 30

프로퍼티 v Lazy Init class Inner{ init(){ print("Inner Create") } } class Outer{ lazy

프로퍼티 v Lazy Init class Inner{ init(){ print("Inner Create") } } class Outer{ lazy var lazy. Init = Inner() init(){ print("Outer Create") } } //인스턴스를 생성할 때 만들어지지 않음 var outer = Outer() //처음 사용할 때 만들어 짐 print(outer. lazy. Init) Outer Create Inner Create __lldb_expr_33. Inner 31

프로퍼티 class Data{ var n 1 = 0; static var n 2 = 0

프로퍼티 class Data{ var n 1 = 0; static var n 2 = 0 class var n 3 : Int{ return 100 { { var obj = Data() print(obj. n 1) print(Data. n 2) print(Data. n 3) //swift에서는 인스턴스가 static 멤버에 접근할 수 없습니다. //print(obj. n 2) 0 0 100 36

프로퍼티 // 키 경로 타입의 타입 확인 class Person { var name: String init(name:

프로퍼티 // 키 경로 타입의 타입 확인 class Person { var name: String init(name: String) { self. name = name } } struct Stuff { var name: String var owner: Person } print(type(of: Person. name)) // Reference. Writable. Key. Path<Person, String> print(type(of: Stuff. name)) // Writable. Key. Path<Stuff, String> //키 경로 타입의 경로 연결 let key. Path = Stuff. owner let name. Key. Path = key. Path. appending(path: . name) Reference. Writable. Key. Path<Person, String> Writable. Key. Path<Stuff, String> 38

프로퍼티 //서브스크립트와 키 경로 활용 class Person { let name: String init(name: String) {

프로퍼티 //서브스크립트와 키 경로 활용 class Person { let name: String init(name: String) { self. name = name } } struct Stuff { var name: String var owner: Person } let adam = Person(name: "adam") let fighting. Chicken = Person(name: "군계") let macbook = Stuff(name: "Mac. Book Pro", owner: adam) var i. Mac = Stuff(name: "i. Mac", owner: adam) let i. Phone = Stuff(name: "i. Phone", owner: adam) let stuff. Name. Key. Path = Stuff. name let ownerkey. Path = Stuff. owner 39

프로퍼티 // Stuff. owner. name과 같은 표현이 됩니다. let owner. Name. Key. Path =

프로퍼티 // Stuff. owner. name과 같은 표현이 됩니다. let owner. Name. Key. Path = ownerkey. Path. appending(path: . name) // 키 경로와 서브스크립트를 이용해 프로퍼티에 접근하여 값을 가져옵니다. print(macbook[key. Path: stuff. Name. Key. Path]) // Mac. Book Pro print(i. Mac[key. Path: stuff. Name. Key. Path]) // i. Mac print(i. Phone[key. Path: stuff. Name. Key. Path]) // i. Phone print(macbook[key. Path: owner. Name. Key. Path]) // adam print(i. Mac[key. Path: owner. Name. Key. Path]) // adam print(i. Phone[key. Path: owner. Name. Key. Path]) // fighting. Chicken // 키 경로와 서브스크립트를 이용해 프로퍼티에 접근하여 값을 변경합니다. i. Mac[key. Path: stuff. Name. Key. Path] = "i. Mac Pro" i. Mac[key. Path: ownerkey. Path] = fighting. Chicken print(i. Mac[key. Path: stuff. Name. Key. Path]) // i. Mac Pro print(i. Mac[key. Path: owner. Name. Key. Path]) // fighting. Chicken // 상수로 지정한 값 타입과 읽기 전용 프로퍼티는 키 경로 서브스크립트로도 값을 바꿔줄 수 없습니다. // macbook[key. Path: stuff. Name. Key. Path] = "macbook pro touch bar" // 오류 발생! // adam[key. Path: Person. name] = "bear" // 오류 발생! 40

프로퍼티 Mac. Book Pro i. Mac i. Phone adam i. Mac Pro 군계 41

프로퍼티 Mac. Book Pro i. Mac i. Phone adam i. Mac Pro 군계 41

메소드 class Class. Point} var x = 0. 0 var y = 0. 0

메소드 class Class. Point} var x = 0. 0 var y = 0. 0 func get. X() -> Double} return x { func set. X(x: Double}( self. x = x { { var cp = Class. Point() cp. set. X(x: 10. 8( print(cp. get. X(() 10. 8 좌표 43

메소드 class Class. Point} var x = 0. 0 var y = 0. 0

메소드 class Class. Point} var x = 0. 0 var y = 0. 0 static let name = "좌표" func get. X() -> Double} return x { func set. X(x: Double}( self. x = x { static func disp}() print(name( { { var cp = Class. Point() cp. set. X(x: 10. 8( print(cp. get. X(() //cp. disp() Class. Point. disp() 45

메소드 class Class. Point{ var x = 0. 0 var y = 0. 0

메소드 class Class. Point{ var x = 0. 0 var y = 0. 0 static let name = "좌표" func get. X() -> Double{ return x { func set. X(x: Double){ self. x = x { static func disp(){ print(name( { @objc func attack(){ print("공격(" { { var cp = Class. Point() var game. Timer: Timer = Timer. scheduled. Timer( time. Interval: 5, target: cp, selector: #selector(Class. Point. attack), user. Info: nil, repeats: true) 공격 공격 47

초기화 메소드 와 소멸자 메소드 class Class. Point{ var x : Int init(){ x

초기화 메소드 와 소멸자 메소드 class Class. Point{ var x : Int init(){ x = 0 } init(x: Int){ self. x = x } deinit{ print("인스턴스 소멸") } } var cp 1 : Class. Point! = Class. Point() var cp 2 = Class. Point. init(x: 10) var cp 3 = cp 1 = nil print("여기서 소멸") cp 3 = nil 여기서 소멸 인스턴스 소멸 49

초기화 메소드 와 소멸자 메소드 //Student 열거형과 초기화 위임 enum Student { case elementary,

초기화 메소드 와 소멸자 메소드 //Student 열거형과 초기화 위임 enum Student { case elementary, middle, high case none // 사용자정의 이니셜라이저가 있는 경우, init() 메서드를 구현해주어야 기본 이니셜라이저를 사용할 수 있음 init() { self =. none } init(korean. Age: Int) { switch korean. Age { case 8. . . 13: self =. elementary case 14. . . 16: self =. middle case 17. . . 19: self =. high default: self =. none } } // 첫 번째 사용자정의 이니셜라이저 51

초기화 메소드 와 소멸자 메소드 init(born. At: Int, current. Year: Int) { // 두

초기화 메소드 와 소멸자 메소드 init(born. At: Int, current. Year: Int) { // 두 번째 사용자정의 이니셜라이저 //init을 호출 self. init(korean. Age: current. Year - born. At + 1) } } var younger: Student = Student(korean. Age: 16) print(younger) // middle younger = Student(born. At: 1998, current. Year: 2016) print(younger) // high middle high 52

초기화 메소드 와 소멸자 메소드 //열거형의 실패 가능한 이니셜라이저 enum Student: String { case

초기화 메소드 와 소멸자 메소드 //열거형의 실패 가능한 이니셜라이저 enum Student: String { case elementary = "초등학생", middle = "중학생", high = "고등학생" init? (korean. Age: Int) { switch korean. Age { case 8. . . 13: self =. elementary case 14. . . 16: self =. middle case 17. . . 19: self =. high default: return nil } } init? (born. At: Int, current. Year: Int) { self. init(korean. Age: current. Year - born. At + 1) } } 53

초기화 메소드 와 소멸자 메소드 var younger: Student? = Student(korean. Age: 20) print(younger) //

초기화 메소드 와 소멸자 메소드 var younger: Student? = Student(korean. Age: 20) print(younger) // nil younger = Student(born. At: 2020, current. Year: 2016) print(younger) // nil younger = Student(raw. Value: "대학생") print(younger) // nil younger = Student(raw. Value: "고등학생") print(younger) // high nil nil Optional(__lldb_expr_29. Student. high) 54

초기화 메소드 와 소멸자 메소드 class Person { var name: String var age: Int

초기화 메소드 와 소멸자 메소드 class Person { var name: String var age: Int var gender: String init(name: String, age: Int, gender: String) { self. name = name self. age = age self. gender = gender } convenience init(age: Int, gender: String) { self. init(name: "adam", age: age, gender: gender) } } let adam = Person(age: 44, gender: "남자") let ryu = Person(name: "류시아", age: 43, gender: "여자") print(adam) print(ryu) 55

Swift Access Control v Access Control 57

Swift Access Control v Access Control 57

Swift Access Control v 암묵적 룰 Getter와 Setter에 서로 다른 접근제어자를 적용할 수 있음

Swift Access Control v 암묵적 룰 Getter와 Setter에 서로 다른 접근제어자를 적용할 수 있음 o 이 기능은 getter, setter를 모두 설정하지 않아도 되는 장점을 제공 public struct Car { fileprivate var _engine: String } public var engine: String { public get { return self. _engine } fileprivate set { self. _engine = new. Value } } // 위의 코드를 getter와 setter에 대해 더 간결하고, 명확하게 정의할 수 있음 public struct Car { fileprivate(set) var engine: String } o 변수를 감싸고 있는 entity의 접근제어자가 public이면 그 내부 entity들은 기본적으로 이를 따라 가기 때문에 engine의 getter는 public, setter는 fileprivate 59

Swift Access Control v 암묵적 룰 Protocol(인터페이스)에 만들 때는 get만 생성 가능 protocol Car

Swift Access Control v 암묵적 룰 Protocol(인터페이스)에 만들 때는 get만 생성 가능 protocol Car { var engine: String { get } } struct Car. Model: Car { private(set) var engine: String } 60

Sub. Script class School { var number: Int = 0 var students: [Student] =

Sub. Script class School { var number: Int = 0 var students: [Student] = [Student]() func add. Student(name: String) { let student: Student = Student(name: name, number: self. number) self. students. append(student) self. number += 1 } func add. Students(names: String. . . ) { for name in names { self. add. Student(name: name) } } //서브스크립트 [인덱스]를 이용하면 인덱스 번째 데이터를 리턴 subscript(index: Int) -> Student? { if index < self. number { return self. students[index] } return nil } } 63

Sub. Script let high. School: School = School() high. School. add. Students(names: "지수", "제니",

Sub. Script let high. School: School = School() high. School. add. Students(names: "지수", "제니", "로제", "리사") let a. Student: Student? = high. School[1] print("₩(a. Student!. number) ₩(a. Student!. name)") 1 제니 64

Sub. Script //복수의 서브스크립트 구현 struct Student { var name: String var number: Int

Sub. Script //복수의 서브스크립트 구현 struct Student { var name: String var number: Int } class School { var number: Int = 0 var students: [Student] = [Student]() func add. Student(name: String) { let student: Student = Student(name: name, number: self. number) self. students. append(student) self. number += 1 } func add. Students(names: String. . . ) { for name in names { self. add. Student(name: name) } } 66

Sub. Script subscript(index: Int) -> Student? { get { if index < self. number

Sub. Script subscript(index: Int) -> Student? { get { if index < self. number { return self. students[index] } return nil } // 첫 번째 서브스크립트 set { guard var new. Student: Student = new. Value else { return } var number: Int = index if index > self. number { number = self. number += 1 } new. Student. number = number self. students[number] = new. Student } } 67

Sub. Script subscript(name: String) -> Int? { // 두 번째 서브스크립트 get { return

Sub. Script subscript(name: String) -> Int? { // 두 번째 서브스크립트 get { return self. students. filter{ $0. name == name }. first? . number } set { guard var number: Int = new. Value else { return } if number > self. number { number = self. number += 1 } let new. Student: Student = Student(name: name, number: number) self. students[number] = new. Student } } subscript(name: String, number: Int) -> Student? { // 세 번째 서브스크립트 return self. students. filter{ $0. name == name && $0. number == number }. first } } 68

Sub. Script let high. School: School = School() high. School. add. Students(names: "지수", "제니",

Sub. Script let high. School: School = School() high. School. add. Students(names: "지수", "제니", "로제", "리사") let a. Student: Student? = high. School[1] print("₩(a. Student!. number) ₩(a. Student!. name)") print(high. School["지수"]!) // Optional(0) print(high. School["조이"]) // nil high. School[0] = Student(name: "예지", number: 0) high. School["로제"] = 1 print(high. School["태연"]) print(high. School["로제", 1]) print(high. School["리사", 4]) // nil // Optional(1) // // nil 1 제니 0 nil Optional(1) Optional(__lldb_expr_50. Student(name: "로제", number: 1)) nil 69

Sub. Script //타입 서브스크립트 구현 enum School: Int { case elementary = 1, middle,

Sub. Script //타입 서브스크립트 구현 enum School: Int { case elementary = 1, middle, high, university static subscript(level: Int) -> School? { return Self(raw. Value: level) // return School(raw. Value: level)과 같은 표현 } } let school: School? = School[2] print(school) // School. middle Optional(__lldb_expr_52. School. middle) 70

Optional Chaining //강제 Unwrapping 과 Optional Chaining class Person { var residence: Residence? }

Optional Chaining //강제 Unwrapping 과 Optional Chaining class Person { var residence: Residence? } class Residence { var number. Of. Rooms = 1 } let adam = Person() //강제로 Unwrapping - 에러 //let room. Count = adam. residence!. number. Of. Rooms //Optional 을 이용하면 residence 가 nil if let room. Count = adam. residence? . number. Of. Rooms { print("adam's residence has ₩(room. Count) room(s). ") } else { print("Unable to retrieve the number of rooms. ") } adam. residence = Residence() if let room. Count = adam. residence? . number. Of. Rooms { print("adam's residence has ₩(room. Count) room(s). ") } else { print("Unable to retrieve the number of rooms. ") } 72

Optional Chaining Unable to retrieve the number of rooms. adam's residence has 1 room(s).

Optional Chaining Unable to retrieve the number of rooms. adam's residence has 1 room(s). 73

Optional Chaining //Multi Level Optional Chaninig class Room { let name: String init(name: String)

Optional Chaining //Multi Level Optional Chaninig class Room { let name: String init(name: String) { self. name = name } } class Address { var building. Name: String? var building. Number: String? var street: String? func building. Identifier() -> String? { if let building. Number = building. Number, let street = street { return "₩(building. Number) ₩(street)" } else if building. Name != nil { return building. Name } else { return nil } } } 74

Optional Chaining class Residence { var rooms = [Room]() var number. Of. Rooms: Int

Optional Chaining class Residence { var rooms = [Room]() var number. Of. Rooms: Int { return rooms. count } subscript(i: Int) -> Room { get { return rooms[i] } set { rooms[i] = new. Value } } //리턴 타입은 기본적으로 Void 인데 Residence가 Regidence? 가 호출하면 Void? func print. Number. Of. Rooms() { print("The number of rooms is ₩(number. Of. Rooms)") } var address: Address? } class Person { var residence: Residence? } 75

Optional Chaining let adam = Person() //room. Count는 nil if let room. Count =

Optional Chaining let adam = Person() //room. Count는 nil if let room. Count = adam. residence? . number. Of. Rooms { print("adam's residence has ₩(room. Count) room(s). ") } else { print("Unable to retrieve the number of rooms. ") } let some. Address = Address() some. Address. building. Number = "100" some. Address. street = "서울시 양천구 목동" //할당 실패 adam. residence? . address = some. Address func create. Address() -> Address { print("Function was called. ") let some. Address = Address() some. Address. building. Number = "100" some. Address. street = "서울시 양천구 목동" return some. Address } //residence가 nil이기 때문에 함수가 호출되지 않음 adam. residence? . address = create. Address() 76

Optional Chaining //Void 가 아니고 Void? 이므로 nil 과 비교 가능 if adam. residence?

Optional Chaining //Void 가 아니고 Void? 이므로 nil 과 비교 가능 if adam. residence? . print. Number. Of. Rooms() != nil { print("It was possible to print the number of rooms. ") } else { print("It was not possible to print the number of rooms. ") } //residence 가 nil 이므로 nil if let first. Room. Name = adam. residence? [0]. name { print("The first room name is ₩(first. Room. Name). ") } else { print("Unable to retrieve the first room name. ") } //서브스크립트에 데이터 할당 let adams. House = Residence() adams. House. rooms. append(Room(name: "Living Room")) adams. House. rooms. append(Room(name: "Kitchen")) adam. residence = adams. House if let first. Room. Name = adam. residence? [0]. name { print("The first room name is ₩(first. Room. Name). ") } else { print("Unable to retrieve the first room name. ") } 77

Optional Chaining Unable to retrieve the It was not possible to Unable to retrieve

Optional Chaining Unable to retrieve the It was not possible to Unable to retrieve the The first room name is number of rooms. print the number of rooms. first room name. Living Room. 78

Optional Chaining //연속된 Optional if let adams. Street = adam. residence? . address? .

Optional Chaining //연속된 Optional if let adams. Street = adam. residence? . address? . street { print("adam's street name is ₩(adams. Street). ") } else { print("Unable to retrieve the address. ") } //Optional에 값 할당 let adams. Address = Address() adams. Address. building. Name = "트라팰리스" adams. Address. street = "서울시 양천구 목동" adam. residence? . address = adams. Address if let adams. Address = adam. residence? . address? . street { print("adam's street name is ₩(adams. Address). ") } else { print("Unable to retrieve the address. ") } Unable to retrieve the address. adam's street name is 서울시 양천구 목동. 80

Optional Chaining if let building. Identifier = adam. residence? . address? . building. Identifier()

Optional Chaining if let building. Identifier = adam. residence? . address? . building. Identifier() { print("adam's building identifier is ₩(building. Identifier). ") } if let begins. With. The = adam. residence? . address? . building. Identifier()? . has. Prefix("트라") { if begins. With. The { print("adam's building identifier begins with ₩"트라₩". ") } else { print("adam's building identifier does not begin with ₩"트라₩". ") } } adam's building identifier is 트라팰리스. adam's building identifier begins with "트라". 81

상속 class Person{ var name = "noname" var hometown = "서울" var age =

상속 class Person{ var name = "noname" var hometown = "서울" var age = 0 var message: String{ return "이름은 )name)이고 고향은 )hometown) 나이는 )age"( { func disp}() print(message) { { class Derived. Person : Person{ var task = "없음" { var person = Derived. Person() person. disp() 이름은 noname이고 고향은 서울 나이는 0 83

오버라이딩 class Person{ var name = "noname" var hometown = "서울" var age =

오버라이딩 class Person{ var name = "noname" var hometown = "서울" var age = 0 var message: String{ return "이름은 ₩(name)이고 고향은 ₩(hometown) 나이는 ₩(age)" } func disp(){ print(message) } } 86

오버라이딩 class Derived. Person : Person{ var task = "없음" override var message: String{

오버라이딩 class Derived. Person : Person{ var task = "없음" override var message: String{ return "이름은 ₩(name)이고 고향은 ₩(hometown) 나이는 ₩(age) 직책은 ₩(task)" } //매개변수가 없는 init은 상위 클래스의 init을 호출하지 않아도 됨 init(){} //매개변수가 있는 init은 반드시 상위 클래스의 init을 호출해야 함 init(name: String, hometown: String, age: Int, task: String){ self. name = name self. hometown = hometown self. age = age self. task = task } } Overriding declaration requires an 'override' keyword 87

오버라이딩 class Person{ var name = "noname" var hometown = "서울" var age =

오버라이딩 class Person{ var name = "noname" var hometown = "서울" var age = 0 var message: String{ return "이름은 ₩(name)이고 고향은 ₩(hometown) 나이는 ₩(age)" } func disp(){ print(message) } } 88

오버라이딩 class Derived. Person : Person{ var task = "없음" override var message: String{

오버라이딩 class Derived. Person : Person{ var task = "없음" override var message: String{ return "이름은 ₩(name)이고 고향은 ₩(hometown) 나이는 ₩(age) 직책은 ₩(task)" } override init(){} init(name: String, hometown: String, age: Int, task: String){ //super. init() self. name = name self. hometown = hometown self. age = age self. task = task } } 89

오버라이딩 error: swiftoop. playground: 348: 18: error: 'self' used in property access 'age' before

오버라이딩 error: swiftoop. playground: 348: 18: error: 'self' used in property access 'age' before 'super. init' call self. age = age ^ error: swiftoop. playground: 347: 23: error: 'self' used in property access 'hometown' before 'super. init' call self. hometown = hometown ^ error: swiftoop. playground: 346: 19: error: 'self' used in property access 'name' before 'super. init' call self. name = name ^ 90

오버라이딩 class Person{ var name = "noname" var hometown = "서울" var age =

오버라이딩 class Person{ var name = "noname" var hometown = "서울" var age = 0 var message: String{ return "이름은 ₩(name)이고 고향은 ₩(hometown) 나이는 ₩(age)" } func disp(){ print(message) } } 91

오버라이딩 class Derived. Person : Person{ var task = "없음" override var message: String{

오버라이딩 class Derived. Person : Person{ var task = "없음" override var message: String{ return "이름은 ₩(name)이고 고향은 ₩(hometown) 나이는 ₩(age) 직책은 ₩(task)" } override init(){} init(name: String, hometown: String, age: Int, task: String){ super. init() self. name = name self. hometown = hometown self. age = age self. task = task } } 이름은 noname이고 고향은 서울 나이는 0 직책은 없음 92

오버라이딩 class Vehicle} var speed : Double} get} return 10 { set} { {

오버라이딩 class Vehicle} var speed : Double} get} return 10 { set} { { { class Car: Vehicle} override var speed : Double} get} return 10 { { { error: My. Playground. playground: 41: 18: error: cannot override mutable property with read-only property 'speed' override var speed : Double{ ^ My. Playground. playground: 31: 9: note: attempt to override property here var speed : Double{ ^ var car = Car() print(car( 93

오버라이딩 //프로퍼티 감시자 재정의 class Person { var name: String = "" var age:

오버라이딩 //프로퍼티 감시자 재정의 class Person { var name: String = "" var age: Int = 0 { did. Set { print("Person age : (self. age)") } } var korean. Age: Int { return self. age + 1 } Person age : 44 45 Person age : 43 Student age : 43 Full Name : Ryusia 44 var full. Name: String { get { return self. name } } } set { self. name = new. Value } 94

오버라이딩 class Student: Person { var grade: String = "F" override var age: Int

오버라이딩 class Student: Person { var grade: String = "F" override var age: Int { did. Set { print("Student age : (self. age)") } } override var korean. Age: Int { get { return super. korean. Age } } } set { self. age = new. Value - 1 } // did. Set { } // 오류 발생!! override var full. Name: String { did. Set { print("Full Name : (self. full. Name)") } } 95

오버라이딩 let adam: Person = Person() adam. name = "아담" adam. age = 44

오버라이딩 let adam: Person = Person() adam. name = "아담" adam. age = 44 // Person age : 44 print(adam. korean. Age) // 45 let ryu: Student = Student() ryu. name = "류시아" ryu. age = 43 ryu. korean. Age = 44 ryu. full. Name = "Ryusia" print(ryu. korean. Age) // 44 96

오버라이딩 class Person { var name: String = "" var age: Int = 0

오버라이딩 class Person { var name: String = "" var age: Int = 0 { did. Set { print("Person age : (self. age)") } } var korean. Age: Int { return self. age + 1 } var full. Name: String { get { return self. name } } } set { self. name = new. Value } 97

오버라이딩 class Student: Person { var grade: String = "F" override var age: Int

오버라이딩 class Student: Person { var grade: String = "F" override var age: Int { did. Set { print("Student age : (self. age)") } } override var korean. Age: Int { get { return super. korean. Age } } } set { self. age = new. Value - 1 } // did. Set { } // 오류 발생!! override var full. Name: String { did. Set { print("Full Name : (self. full. Name)") } } 98

오버라이딩 //서브스크립트 재정의 class School { var students: [Student] = [Student]() } subscript(number: Int)

오버라이딩 //서브스크립트 재정의 class School { var students: [Student] = [Student]() } subscript(number: Int) -> Student { print("School subscript") return students[number] } class Middle. School: School { var middle. Students: [Student] = [Student]() } // 부모클래스(School)에게 상속받은 서브스크립트 재정의 override subscript(index: Int) -> Student { print("Middle. School subscript") return middle. Students[index] } 99

오버라이딩 let university: School = School() university. students. append(Student()) university[0] // School subscript let

오버라이딩 let university: School = School() university. students. append(Student()) university[0] // School subscript let middle: Middle. School = Middle. School() middle. Students. append(Student()) middle[0] // Middle. School subscript 100

Type Casting class Vehicle{ var speed : Double{ get} return 10 { set} {

Type Casting class Vehicle{ var speed : Double{ get} return 10 { set} { { { class Car: Vehicle{ { var car = Car() //car = Vehicle() var vehicle = Vehicle() vehicle = Car() print(vehicle is Vehicle) print(vehicle is Car) true 103

Type Casting class Vehicle{ var speed : Double{ get} return 10 { set} {

Type Casting class Vehicle{ var speed : Double{ get} return 10 { set} { { { class Car: Vehicle{ { 104

Type Casting var car = Car() var vehicle: Vehicle = car as Vehicle print(vehicle)

Type Casting var car = Car() var vehicle: Vehicle = car as Vehicle print(vehicle) car = vehicle as! Car print(car) var vehicle 1 = Vehicle() car = vehicle 1 as! Car print(car) __lldb_expr_17. Car Could not cast value of type '__lldb_expr_17. Vehicle' (0 x 11 fc 61088) to '__lldb_expr_17. Car' (0 x 11 fc 61130). 105

Protocol @objc protocol Media. Player{ var is. Play: Bool{get set} func play() func pause()

Protocol @objc protocol Media. Player{ var is. Play: Bool{get set} func play() func pause() func stop() } @objc optional func next. Media() @objc optional func prev. Media() 108

Protocol @objc class DVDPlayer: NSObject, Media. Player{ var is. Play: Bool = false }

Protocol @objc class DVDPlayer: NSObject, Media. Player{ var is. Play: Bool = false } func play(){ print("재생") is. Play = true } func pause(){ print("중지") is. Play = false; } func stop(){ print("정지") is. Play = false } func next. Media(){ print("다음 동영상 재생") } var obj = DVDPlayer() obj. play() print(obj. is. Play) 재생 true 109

불투명 반환 타입 protocol View{ } class Image. View : View{ } class Text.

불투명 반환 타입 protocol View{ } class Image. View : View{ } class Text. View : View{ } func disp 1() -> some View{ return Image. View() } func disp 2() -> some View{ return Text. View() } print(disp 1()) print(disp 2()) __lldb_expr_7. Image. View __lldb_expr_7. Text. View 111

Extension class Basic} var x : Int = 10 { extension Basic} func disp}()

Extension class Basic} var x : Int = 10 { extension Basic} func disp}() print("기능 확장(" { { var basic: Basic = Basic() basic. disp() 기능 확장 113

Generic func swap. Integer(n 1: inout Int, n 2: inout Int){ let temp =

Generic func swap. Integer(n 1: inout Int, n 2: inout Int){ let temp = n 1 = n 2 = temp } func swap. Double(n 1: inout Double, n 2: inout Double){ let temp = n 1 = n 2 = temp } var n 1 = 10 var n 2 = 20 swap. Integer(n 1: &n 1, n 2: &n 2) print("n 1: (n 1) n 2: (n 2)") var n 3 = 10. 3 var n 4 = 20. 4 swap. Double(n 1: &n 3, n 2: &n 4) print("n 3: (n 3) n 4: (n 4)") 115

Generic func swap<T>(n 1 : inout T, n 2 : inout T){ let temp

Generic func swap<T>(n 1 : inout T, n 2 : inout T){ let temp = n 1 = n 2 = temp } var n 5 = 10. 3 var n 6 = 20. 4 swap(n 1: &n 5, n 2: &n 6) print("n 5: (n 3) n 6: (n 4)") n 1: 20 n 2: 10 n 3: 20. 4 n 4: 10. 3 n 5: 20. 4 n 6: 10. 3 116

Generic //제너릭을 적용한 스택 struct Stack<Element> { var items = [Element]() mutating func push(_

Generic //제너릭을 적용한 스택 struct Stack<Element> { var items = [Element]() mutating func push(_ item: Element) { items. append(item) } mutating func pop() -> Element { return items. remove. Last() } } var double. Stack: Stack<Double> = Stack<Double>() double. Stack. push(1. 0) print(double. Stack. items) double. Stack. push(2. 0) print(double. Stack. items) double. Stack. pop() print(double. Stack. items) // [1. 0] // [1. 0, 2. 0] // [1. 0] 117

Generic var string. Stack: Stack<String> = Stack<String>() string. Stack. push("1") print(string. Stack. items) string.

Generic var string. Stack: Stack<String> = Stack<String>() string. Stack. push("1") print(string. Stack. items) string. Stack. push("2") print(string. Stack. items) string. Stack. pop() print(string. Stack. items) // ["1"] // ["1", "2"] // ["1"] var any. Stack: Stack<Any> = Stack<Any>() any. Stack. push(1. 0) print(any. Stack. items) any. Stack. push("2") print(any. Stack. items) any. Stack. push(3) print(any. Stack. items) any. Stack. pop() print(any. Stack. items) // [1. 0] // [1. 0, "2", 3] // [1. 0, "2"] 118

Generic //익스텐션을 통한 제네릭 타입의 기능 추가 extension Stack { var top. Element: Element?

Generic //익스텐션을 통한 제네릭 타입의 기능 추가 extension Stack { var top. Element: Element? { return self. items. last } } print(double. Stack. top. Element) // Optional(1. 0) print(string. Stack. top. Element) // Optional("1") print(any. Stack. top. Element) // Optional("2") n 1: 20 n 2: 10 n 3: 20. 4 n 4: 10. 3 n 5: 20. 4 n 6: 10. 3 119