Преобразование Xcode 8.0 и Swift 3.0: поиск объяснения конкретной ошибки преобразования

Меня немного смущает ошибка преобразования.

Я перенес свой проект из 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 NSNumber и NSNumber(value) должно быть одно и то же.


person Ruvi    schedule 17.09.2016    source источник


Ответы (2)


В Swift 3 NSNumber(value) не будет работать. Допустим, ваше значение является Int. В этом случае вам понадобится NSNUmber(value: yourIntValue). В Swift 3 у вас должно быть имя первого (и в данном случае единственного) параметра в вызове функции. Итак, ваше использование

value as NSNumber

работает, но

NSNumber(value: yourNumberValue)

тоже работает.

person Bryan    schedule 17.09.2016
comment
Хорошо, спасибо, это довольно странное решение от Apple, но теперь я понял. - person Ruvi; 17.09.2016

Прежде всего, я сделал здесь некоторое предположение, я предположил, что -

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 = "???"
    }
}

Надеюсь, это поможет не стесняйтесь оставлять комментарии, если у вас есть какие-либо сомнения.

person Jeet    schedule 17.09.2016
comment
Спасибо за ответ, но я не вижу, как ваше решение решает проблему. Я попробовал ваше решение, и это все та же проблема. Функция numberFormatter.string отказывается (в вашем случае) принимать значение, потому что значение не является NSNumber. Кстати: извините, пропустил правильные типы: numberFormatter = NumberFormatter() celsiusValue : Double? Извините за правки, но всегда нажимал Enter вместо Shift Enter - person Ruvi; 17.09.2016
comment
Хорошо, я обновил код для получения двойного значения, правильный синтаксис для инициализации NSNumber такой же, как и в приведенном выше ответе, т.е. - NSNumber (значение: значение) - person Jeet; 17.09.2016