воскресенье, 28 июня 2020 г.

Swift, Classes, Polymorphism

Online Swift Playground 
 
//Classes (Reference type)
import Foundation

class Person {
    var firstName: String
    var lastName: String

    init(fName: String, lName: String){
        self.firstName = fName
        self.lastName = lName
    }

    func fullName() -> String {
        "Name: " + firstName + " " + lastName
    }
}

class Student: Person {
    var university: String
    //selfrefs - retain cycle problem!
    weak var friend: Student?

    required init(fName: String, lName: String, univer: String){
        self.university = univer
        super.init(fName: fName, lName: lName)
    }

    override func fullName() -> String {
        super.fullName() + ", university: " + university
    }
}

final class Employee: Person {
    var company: String

    init(fName: String, lName: String, comp: String){
        self.company = comp
        super.init(fName: fName, lName: lName)
    }

    deinit{
        print("freeing memory")
    }

    convenience init(another: Employee){
        self.init(fName: another.firstName, lName: another.lastName, comp: another.company)
    }

    override func fullName() -> String {
        super.fullName() + ", company: " + company
    }
}

let p1 = Person(fName: "Mike", lName: "Mikov")
let s1 = Student(fName: "Tom", lName: "Tomov", univer: "Oxford")
var e1 = Employee(fName: "Artem", lName: "Artemov", comp: "Toyota")
var e2 = Employee(another: e1)

//Type check - is
var persons: [Person] = [p1, s1, e1, e2]
for person in persons{
    switch (person){
        case is Student:
            print("student")
        case is Employee:
            print("employee")
        default:
            print("person")
    }
}

//Casting - as, as?, as!
func infoAbout(_ person: Person){
    if let _ = person as? Student {
        print(person.fullName() + " -> this is a Student subclass")
    } else if let _ = person as? Employee {
        print(person.fullName() + " -> this is an Employee subclass")
    } else {
        print(person.fullName() + " -> this is a Person superclass")
    }
}

infoAbout(p1)
infoAbout(s1)
infoAbout(e1)
infoAbout(e2)

//destructing e2
e2 = e1
persons[3] = e1

Комментариев нет:

Отправить комментарий