gpt4 book ai didi

swift - Double 的扩展以接受 String 作为 Swift 中的初始值设定项

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

Swift 中有没有办法定义 Double 类型的扩展以接受 String 作为初始值设定项?简而言之,只是为了弄清楚可行性,我需要这个工作:

var double:Double = "one"
println(double) // Outputs "1.0"

我猜测它应该符合 StringLiteralConvertible,但不确定细节。

最佳答案

那么,您想要自然语言解析一个字符串,并从中生成一个 float 吗?

嗯,扩展是最简单的部分。只需为其创建一个可失败的初始化程序即可:

let digits = [
"zero", "one", "two", "three",
"four", "five", "six", "seven",
"eight", "nine",
]

extension Double {
init?(fromEnglishString s: String) {
if let digit = find(digits, s) {
self.init(Double(digit))
}
else {
return nil
}
}
}

let d = Double(fromEnglishString: "one")
// d is {Some 1.0}

困难的部分是找到一个好的解析器来支持用英语表达数字的所有方式(尤其 float )。这要棘手得多。您可能会发现this与语言无关的答案更有趣。

您还可以为其编写一个 StringLiteralConvertible 扩展。然而,这仅适用于在编译时直接从字符串文字初始化值的情况 - 这有点毫无意义,我的意思是,您真的需要在源代码中使用基于单词的数字文字吗?另一个问题是文字可转换初始值设定项不能失败,因此如果无法解析字符串,您将不得不返回默认值(可能是 NaN?)。

尽管如此,如果你真的想要一个:

extension Double: StringLiteralConvertible {
public typealias StringLiteralType = String
public typealias UnicodeScalarLiteralType = String
public typealias ExtendedGraphemeClusterLiteralType = String

public init(unicodeScalarLiteral value: UnicodeScalarLiteralType) {
self.init(stringLiteral: value)
}

public init(extendedGraphemeClusterLiteral value: ExtendedGraphemeClusterLiteralType) {
self.init(stringLiteral: value)
}

public init(stringLiteral value: String) {
if let d = Double(fromEnglishString: value) {
self = d
} else {
self = 0.0
}
}
}

let doubleFromLiteral: Double = "three"
// doubleFromLiteral is {Some 3.0}

关于swift - Double 的扩展以接受 String 作为 Swift 中的初始值设定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27712829/

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