asStringを定義する必要はありません。
protocol ConvertibleToString {var asString: String {get}}
extension Int: ConvertibleToString {
var asString: String {return String(self)}
}
asStringを定義する必要はありません。
protocol ConvertibleToString {var asString: String {get}}
extension Int: ConvertibleToString {
var asString: String {return String(self)}
}
init
あなたの質問を正しく理解していれば、いいえ、特定の型からの一致を検出して使用する「暗黙の」変換を定義できないとは思いません。Swift であるタイプから別のタイプに変換する唯一の方法init
は、「from」タイプを取る「to」タイプ、または「to」タイプを返す「from」タイプの関数またはメソッドを明示的に呼び出すことです。「このタイプの を他のタイプで使用できる場合は、このタイプを使用する」というプロトコルを実装する方法はありませんinit
。
ところで、あなたのConvertibleToString
プロトコルは本質的にPrintable
(asString
の代わりにdescription
) のバージョンです。したがって、何かが文字列に変換可能かどうかを知りたい場合は、 への準拠を確認するだけですPrintable
。1 つの落とし穴に注意してください –String
ではありませんPrintable
。を使用toString(thing)
して何でも文字列に変換でき、使用可能な場合は使用さPrintable
れます (文字列の変換には何もしません)。あなたの必要性。
プロトコルを介して何かから変換可能性を要求できることに注意してください。
protocol ConvertibleFromInt {
init(Int)
}
extension String: ConvertibleFromInt { }
extension UInt64: ConvertibleFromInt { }
func gimmeFromInt<T: ConvertibleFromInt>(i: Int) -> T {
return T(i)
}
let s: String = gimmeFromInt(5)
let ui: UInt64 = gimmeFromInt(5)