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
Комментариев нет:
Отправить комментарий