我不想要定义 asString 。
protocol ConvertibleToString {var asString: String {get}}
extension Int: ConvertibleToString {
var asString: String {return String(self)}
}
答案 0 :(得分:1)
如果我理解你的问题 - 不,我不认为你不能定义一个隐含的"检测并使用特定类型的匹配init
的转换。在Swift中从一种类型转换为另一种类型的唯一方法是明确地调用init
来获取"到#34;采用"来自"的类型类型,或"来自"的功能或方法返回"到"的类型类型。没有办法实现一个协议,说明"将init
用于其他类型的此类型(如果有的话)#34;。
顺便说一句,您的ConvertibleToString
协议基本上是Printable
的版本(asString
代替description
)。因此,如果您想要知道某些内容是否可转换为字符串,则可以检查是否符合Printable
。虽然注意到一个问题 - 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)