您是否可以在协议中强制执行类型转换而无需定义属性/方法?

时间:2015-01-30 22:11:40

标签: swift type-conversion protocols class-extensions

我不想要定义 asString

protocol ConvertibleToString {var asString: String {get}}

extension Int: ConvertibleToString {
    var asString: String {return String(self)}
}

1 个答案:

答案 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)