首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Swift中接受字符串作为初始化器的Double扩展名

Swift中接受字符串作为初始化器的Double扩展名
EN

Stack Overflow用户
提问于 2014-12-30 21:28:58
回答 2查看 523关注 0票数 0

是否有一种在Swift中为类型Double定义扩展以接受字符串作为初始化程序的方法?简单地说,为了找出可行性,我需要这样做:

代码语言:javascript
运行
复制
var double:Double = "one"
println(double) // Outputs "1.0"

我猜它应该与StringLiteralConvertible兼容,但不确定细节。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-30 21:44:27

所以,你想要用自然语言解析一个字符串,然后从它生成一个浮点数?

扩展是很容易的部分。只需为其创建一个可失败的初始化程序:

代码语言:javascript
运行
复制
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}

最困难的部分是找到一个很好的解析器,可以用英语表达数字(特别是浮点数)。那就更棘手了。您可能会发现更多的语言不可知论的答案有趣。

您还可以为它编写一个StringLiteralConvertible扩展。但是,这只是在编译时直接从字符串文本初始化值的时候--这有点没有意义,我的意思是,您真的需要源代码中基于字的数字文字吗?另一个问题是文字可转换初始化程序不能失败,因此您将不得不返回默认值(可能是NaN?)如果字符串不能被解析。

不过,如果你真的想要的话:

代码语言:javascript
运行
复制
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}
票数 1
EN

Stack Overflow用户

发布于 2014-12-30 21:44:27

如果你想做你的代码示例所做的事情.编写实现StringLiteralConvertible协议的扩展。在字面可转换的在NSHipster上有一个很好的记录。

很可能是这样的:

代码语言:javascript
运行
复制
extension Double: StringLiteralConvertible {
    convenience init(value: String) {
        if value == "one" {
            self = 1.0
        /*
        Add more English-to-number conversion magic here
        */
        } else {
            return NaN
        }
    }
}

不仅如此,StringLiteralConvertible还扩展了一些其他协议,您必须满足这些协议的要求,然后是将英语翻译成数字的整个业务。您可能会遇到一个可行性问题,但是从技术上来说,从字符串中生成Double是可能的。

最重要的是,对于这是否是一个好主意,还有更多的问题。

  • 文字初始化程序不会失败,因此您必须为无法解析数字的字符串返回一个哨位值。不是很大的打击。
  • 您实际上想要转换字符串文本,还是在运行时传入的字符串?前者似乎不太有用。后者在调用站点需要不同的语法,但可以让您清楚地表明您正在定义/使用转换函数。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27712829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档