(必要に応じて質問のタイトルを自由に変更してください)
私は多くの BLE データを扱っており、デバッグの目的でUInt8
、HEX
計算された変数で簡単に拡張できることがわかりました。
extension UInt8 {
var HEX:String {
return String(format: "%02X", self)
}
}
// 190.HEX --> "BE"
小文字のバリアントが必要であることに気付きました。そして、私はそれが欲しかったのUInt32
ですUInt16
。変更されるのは印刷する桁数だけなので、ある種のプロトコルでこれを行うことができると思いました (少なくとも教育目的では)。
protocol HexPrintable {
var hexDigitCount:Int { get }
}
extension UInt8:HexPrintable {
var hexDigitCount:Int {
return 2
}
}
extension UInt16:HexPrintable {
var hexDigitCount:Int {
return 4
}
}
extension UInt32:HexPrintable {
var hexDigitCount:Int {
return 8
}
}
HEX
次に、これを利用してandhex
メソッドのデフォルトの実装を提供したい部分です。
extension HexPrintable {
var HEX:String {
return String(format: "%0\(self.hexDigitCount)X", self)
}
var hex:String {
return String(format: "%0\(self.hexDigitCount)x", self)
}
}
コンパイラ エラーが発生しますArgument type 'Self' does not conform to expected type 'CVarArgType'
。
私はこれを理解していると思います。CVarArgType
プロトコルとして、そのような文字列初期化子で使用できる型 ( ) を採用する型になることを保証できないと言っています。where
それで初めて節を使えると思った。プロトコル拡張を次のように変更しました。
extension HexPrintable where Self == CVarArgType { ...
これはにつながりSame-type requirement makes generic parameter 'Self' non-generic
ます。その時点で私のアマチュアタイプの理論家の理解があふれました。異なる UInt サイズで 2 つの拡張メソッドを機能させる魔法は何ですか?