在 Swift 中使用初始值设定项与"()"将非字符串类型转换为字符串类型的最佳方法是什么?



我想将符合BinaryFloatingPoint的值类型转换为String,但我注意到xCode中没有该值的初始值设定项!我在这个向下的代码中使用了"()",但我知道什么是转换的唯一方法?

func test<T: BinaryFloatingPoint>(value: T) {

let stringValue: String = "(value)"
print(stringValue)

}

另一方面,我试图将BinaryInteger转换为String,我发现有一个初始化器,但我想为什么我们甚至需要这个初始化器?因为如果有或没有初始值设定项,我们也可以在这里使用"()",而不会打扰自己!

func test<T: BinaryInteger>(value: T) {

let stringValue: String = String(value)
print(stringValue)

}

目标:所以我想知道为什么我们需要String初始值设定项,当我们可以用"()"转换所有内容时?

不,这不是转换它的唯一方法。您可以向泛型类型添加另一个约束,要求它也符合LosslessStringConvertible。请注意,所有BinaryFloatingPoint类型都符合CustomStringConvertible,但并非所有类型都符合LosslessStringConvertible(即CGFloat(。

如果你不关心你的方法支持CGFloat,你可以约束它LosslessStringConvertible,否则你需要使用CustomStringConvertibleString(describing:)初始值设定项。


这将不支持CGFloat

func test<T: BinaryFloatingPoint & LosslessStringConvertible>(value: T) {        
let stringValue = String(value)
print(stringValue)

}

这将支持所有BinaryFloatingPoint浮点类型。请注意,您不需要约束到CustomStringConvertible。这只是为了示范。

func test<T: BinaryFloatingPoint & CustomStringConvertible>(value: T) {
let stringValue = String(describing: value)
print(stringValue)
}

您还可以使CGFloat也符合LosslessStringConvertible

extension CGFloat: LosslessStringConvertible {
private static let formatter = NumberFormatter()
public init?(_ description: String) {
guard let number = CGFloat.formatter.number(from: description) as? CGFloat else { return nil }
self = number
}
}

这将允许您使用泛型方法支持所有浮点类型,并使用String初始值设定项。

我想知道为什么我们需要字符串初始值设定项,当我们可以用"()"转换所有内容时

问问自己"()"是做什么的。默认情况下,它调用初始值设定项!即CCD_ 19。这反过来又取决于CustomStringConvertible等。请参阅https://developer.apple.com/documentation/swift/string/2427941-init

最新更新