Menu
Coddy logo textTech

復習 - 従業員の階層構造

CoddyのSwiftジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 26/57。

challenge icon

チャレンジ

難しい

スタッフ名簿を作成してください。Person は name を保持し、role() は person を返し、card() は role() から構成された Ada (person) を返します。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プレイグラウンド