gpt4 book ai didi

swift - 您可以在协议(protocol)中强制执行类型转换而不定义属性/方法吗?

转载 作者:行者123 更新时间:2023-11-30 10:19:14 25 4
gpt4 key购买 nike

我不想定义asString

protocol ConvertibleToString {var asString: String {get}}

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

最佳答案

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

顺便说一句,您的 ConvertibleToString 协议(protocol)本质上是 Printable 的一个版本(用 asString 代替 description)。因此,如果您想要知道某些内容是否可以转换为字符串,您只需检查是否符合 Printable 即可。但请注意一个问题 - String 不是 Printable。您可以使用 toString(thing) 将任何内容转换为字符串,并且它会在可用的情况下使用 Printable (并且不执行任何转换字符串操作),尽管这确实有副作用- 为您提供默认的不可打印类型的效果,根据您的需要,您可能不需要这些类型。

请注意,您可以通过协议(protocol)要求可转换某些内容:

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)

关于swift - 您可以在协议(protocol)中强制执行类型转换而不定义属性/方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28245500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com