您可以在不定义 property/method 的情况下在协议中强制执行类型转换吗?
Can you enforce type conversion in a protocol without defining a property/method?
我不想定义 asString。
protocol ConvertibleToString {var asString: String {get}}
extension Int: ConvertibleToString {
var asString: String {return String(self)}
}
如果我没有正确理解您的问题 – 不,我不认为您不能定义一个 "implicit" 转换来检测和使用来自特定类型的匹配 init
。在 Swift 中从一种类型转换为另一种类型的唯一方法是为采用 "from" 类型的 "to" 类型显式调用 init
,或者调用函数或方法"from" 类型 returns "to" 类型。无法实现 "use the init
for this type with other type, if one is available".
协议
顺便说一下,您的 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)
我不想定义 asString。
protocol ConvertibleToString {var asString: String {get}}
extension Int: ConvertibleToString {
var asString: String {return String(self)}
}
如果我没有正确理解您的问题 – 不,我不认为您不能定义一个 "implicit" 转换来检测和使用来自特定类型的匹配 init
。在 Swift 中从一种类型转换为另一种类型的唯一方法是为采用 "from" 类型的 "to" 类型显式调用 init
,或者调用函数或方法"from" 类型 returns "to" 类型。无法实现 "use the init
for this type with other type, if one is available".
顺便说一下,您的 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)