【问题标题】:Xcode 8.0 and Swift 3.0 conversion: Looking for explanation for a particular conversion errorXcode 8.0 和 Swift 3.0 转换:寻找特定转换错误的解释
【发布时间】:2016-09-17 15:45:14
【问题描述】:

我对转换错误有点困惑。

我将我的项目从 Swift 2.3 迁移到 Swift 3.0

    func updateCelsiusLabel() {

    if let value = celsiusValue {

        //This was the original code (that worked but is) failing after migration 
        //due to: Argument labels do not match any available overloads
        celsiusLabel.text = numberFormatter.string(from: NSNumber(value))


        //This is my code trying to fix this issue and the project is now compiling 
        //and everything is fine
         celsiusLabel.text = numberFormatter.string(from: value as NSNumber)

    }
    else { celsiusLabel.text = "???"
    }
}

起初我认为在 Swift 3.0 中,现在禁止转换 Type(value),但我检查了一下,我绝对没有收到编译器警告。谁能告诉我NSNumber(value) 的问题是什么?

据我了解value as NSNumberNSNumber(value) 应该是同一个东西。

【问题讨论】:

    标签: swift swift3 nsnumber xcode8 numberformatter


    【解决方案1】:

    在 Swift 3 中,NSNumber(value) 不起作用。假设您的值是一个 Int。在这种情况下,您需要NSNUmber(value: yourIntValue)。在 Swift 3 中,您必须拥有函数调用中第一个(在这种情况下也是唯一一个)参数的名称。所以,你对

    的使用
    value as NSNumber
    

    有效,但是

    NSNumber(value: yourNumberValue)
    

    也可以。

    【讨论】:

    • 好的,谢谢,这是苹果做出的奇怪决定,但我现在明白了。
    【解决方案2】:

    首先我在这里做了一些假设,我假设-

    numberFormatter = NSNumberFormatter() // 现在已经重命名为 NumberFormatter celsiusLabel.text 我将文本作为可选字符串,例如,您可以使用 label.text 。

    在上述假设之后,请参阅下面的代码,它可以在 Swift 3 中运行 -

    var celsiusValue:Double?
    var numberFormatter = NumberFormatter()
    var text:String?
    func updateCelsiusLabel() {
    
        if let value = celsiusValue {
    
            //This was the original code (that worked but is) failing after migration due to: Argument labels do not match any available overloads
            text = numberFormatter.string(from: NSNumber(value: value))!
    
        }
        else {
            text = "???"
        }
    }
    

    如果您有任何疑问,请随时发表评论。

    【讨论】:

    • 感谢您的回答,但我看不到您的解决方案如何解决问题。我尝试了您的解决方案,但仍然是同样的问题。 numberFormatter.string 函数拒绝(在您的情况下)取值,因为 value 不是 NSNumber。顺便说一句:抱歉错过了正确的类型: numberFormatter = NumberFormatter() celsiusValue : Double?很抱歉编辑,但总是按下输入而不是 shift 输入
    • 好的,我已经更新了获取双精度值的代码,NSNumber 初始化的正确语法与上面的答案相同,即 - NSNumber(value: value)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 2020-08-05
    • 2019-12-29
    • 2016-07-22
    • 2018-05-20
    • 1970-01-01
    相关资源
    最近更新 更多