秘伝のタレ

protocol EnumRandomized {
  static var all: [Self] { get }
  static var random: Self? { get }
}

extension EnumRandomized {
  static var random: Self? {
    let all = self.all
    if all.isEmpty { return nil }
    let index = Int(arc4random_uniform(UInt32(all.count)))
    return all[index]
  }
}

extension Hand: EnumRandomized {
  static var all: [Hand] {
    return [rock, paper, scissors]
  }
}


func speak(userHand: Hand) -> String {
    let combination = (self.hand, userHand)
    switch combination {
    case let (x, _) where x == .prepare:
        return "本田とじゃんけん"
    case let (_, y) where y == .prepare:
        return "本田とじゃんけん"
    case (let x, let y) where x == y:
        return "あいこです。\n最後まで気を抜かないでください。"
    case (let x, let y) where
            (x == .rock && y == .paper) ||
            (x == .paper && y == .scissors) ||
            (x == .scissors && y == .rock):
        return "やるやん。\n明日は俺にリベンジさせて。"
    case (let x, let y) where x == .scissors && y == .paper:
        return "なんで負けたか、\n明日まで考えといてください。\nそしたら何かが\n見えてくるはずです。"
    case (let x, let y) where x == .rock && y == .scissors:
        return "たかがじゃんけん、\nそう思ってないですか?\nそれやったら明日も\n俺が勝ちますよ。"
    case (let x, let y) where x == .paper && y == .rock:
        return "負けは次に繋がる\nチャンスです。\nネバーギブアップ!"
    default:
        return "本田とじゃんけん"
    }
}