0

我不想定义asString

protocol ConvertibleToString {var asString: String {get}}

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

1 回答 1

1

如果我正确理解您的问题 - 不,我认为您不能定义检测并使用init来自特定类型的匹配的“隐式”转换。在 Swift 中从一种类型转换为另一种类型的唯一方法是显式调用init采用“from”类型的“to”类型,或者在“from”类型上调用返回“to”类型的函数或方法。没有办法实现一个协议,说“init如果有一个可用,则将此类型与其他类型一起使用”。

顺便说一句,您的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)
于 2015-01-30T22:30:22.770 回答