Menu
Coddy logo textTech

Повторение — иерархия сотрудников

Часть раздела Объектно-ориентированное программирование путешествия по Swift на Coddy. Урок 26 из 57.

challenge icon

Задание

Сложно

Создайте каталог сотрудников. Person хранит name и имеет role(), возвращающий person, а также card(), возвращающий Ada (person), сформированный на основе role(). Staff: Person добавляет department, задаваемый в собственном инициализаторе до вызова super.init, и переопределяет role(), чтобы возвращать staff in <department>. Manager: Staff добавляет team (массив Staff, изначально пустой), метод hire(_:) и переопределяет role(), чтобы возвращать роль Staff, за которой следует , 2 reports. Contractor: Person является final, добавляет days и переопределяет role(), чтобы возвращать contractor for 30 days.

Предоставленный код считывает строки staff,name,dept, manager,name,dept, contractor,name,days и hire,manager,staff (менеджер нанимает сотрудника по имени). Он выводит card() для каждого человека в порядке их создания.

Ваш код должен находиться в файлах Person.swift, Staff.swift, Manager.swift и Contractor.swift. В main.swift находится предоставленный код ввода/вывода, и его нельзя изменять.

Попробуйте сами

// Предоставленный код ввода/вывода: оставьте его как есть
var input: [String] = []
while let line = readLine() { input.append(line) }
var people: [Person] = []
for line in input {
    let p = line.split(separator: ",").map(String.init)
    switch p[0] {
    case "staff": people.append(Staff(name: p[1], department: p[2]))
    case "manager": people.append(Manager(name: p[1], department: p[2]))
    case "contractor": people.append(Contractor(name: p[1], days: Int(p[2])!))
    default:
        let boss = people.first { $0.name == p[1] } as? Manager
        let member = people.first { $0.name == p[2] } as? Staff
        if let boss = boss, let member = member { boss.hire(member) }
    }
}
for person in people { print(person.card()) }

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Песочница Swift