LoginSignup
11

More than 5 years have passed since last update.

楽しい Swift クイズ (やや難)

Last updated at Posted at 2016-08-13

クイズ

下記の動作をする Quiz を実装してください。

let quiz = Quiz()
quiz.chameleon             // ❗️error: ambiguous use of 'chameleon'
quiz.chameleon as Int      // 1
quiz.chameleon as String   // "string"
quiz.chameleon as UIColor  // UIDeviceRGBColorSpace 0 1 0 1 (UIColor.greenColor())

ヒント

下記のように書くと、一つめの条件が満たせません。

import UIKit

struct Quiz {
    var chameleon = "string"
}

let quiz = Quiz()
quiz.chameleon // "string"
一つめの条件
quiz.chameleon // ❗️error: ambiguous use of 'chameleon'

では、chameleon はどこに?

クイズ(おまけ)

下記の動作をする Quiz を実装してください。

let quiz = Quiz()
quiz.chameleon             // "string"
quiz.chameleon as Int      // 1
quiz.chameleon as String   // "string"
quiz.chameleon as UIColor  // UIDeviceRGBColorSpace 0 1 0 1 (UIColor.greenColor())

答えと解説

答え

クイズの答え
import UIKit

struct Quiz {}

protocol A {
    var chameleon: String { get }
}

extension A {
    var chameleon: String { return "string" }
}

protocol B {
    var chameleon: Int { get }
}

extension B {
    var chameleon: Int { return 1 }
}

protocol C {
    var chameleon: UIColor { get }
}

extension C {
    var chameleon: UIColor { return UIColor.greenColor() }
}

extension Quiz: A, B, C {}

let quiz = Quiz()
quiz.chameleon             // ❗️error: ambiguous use of 'chameleon'
quiz.chameleon as Int      // 1
quiz.chameleon as String   // "string"
quiz.chameleon as UIColor  // UIDeviceRGBColorSpace 0 1 0 1
クイズ(おまけ)の答え
import UIKit

struct Quiz {
    // ここを追加
    var chameleon = "string"
}

protocol A {
    var chameleon: String { get }
}

//  extension A {
//      var chameleon: String { return "string" }
//  }

protocol B {
    var chameleon: Int { get }
}

extension B {
    var chameleon: Int { return 1 }
}

protocol C {
    var chameleon: UIColor { get }
}

extension C {
    var chameleon: UIColor { return UIColor.greenColor() }
}

extension Quiz: A, B, C {}

let quiz = Quiz()
quiz.chameleon             // "string"
quiz.chameleon as Int      // 1
quiz.chameleon as String   // "string"
quiz.chameleon as UIColor  // UIDeviceRGBColorSpace 0 1 0 1

解説

protocol extension を利用して実装しました。
コードは少し長いですが、基本形は下記です。これを chameleon が変身する各型のために定義します。

protocol A {
    var chameleon: String /* Int, UIColor, ... */ { get }
}
extension A {
    var chameleon: String /* Int, UIColor, ... */ { return "string" }
}

クイズ (おまけ) は、Quiz のプロパティに chameleon を追加して完成です。

終わりに

Twitter (@eduraaa)gist (ezura) でちょくちょくコードの考察のようなものを書いています。今回はその中からクイズを出してみました。
お楽しみいただけると幸いです😄

前回

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11