クイズ
下記の動作をする 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) でちょくちょくコードの考察のようなものを書いています。今回はその中からクイズを出してみました。
お楽しみいただけると幸いです😄