2016-10-15 1 views
0

Я быстрый начинающий, а затем хочу написать подсчет ИМТ.Как я могу исправить Невозможно присвоить valueof типа 'Double' to 'String?' in Swift3

Ошибка Нельзя присвоить значение типа 'Double' to 'String?'

появляются в label.text = GetBMI (H: MYH, W: MYW)

Как я могу это исправить?

@IBAction func calBMI(_ sender: AnyObject) { 
    if Height.text != nil && Weight.text != nil { 
     let myH : Double = (Height.text! as AnyObject).doubleValue 
     let myW : Double = (Weight.text! as AnyObject).doubleValue 
    label.text = GetBMI(H: myH, W: myW) 
    } 
    else { 
     label.text = "Please enter your Height and Weight!" 
    } 
} 

func GetBMI(H: Double, W: Double) -> Double { 
    let height: Double = H/100 
    return W/(height * height) 
} 

ответ

2

Вы можете найти некоторые темы, описывающие, как исправить Невозможно присвоить значение типа «двойной» на «String?», но, к сожалению, эти потоки не могут указывать на некоторые плохие части вашего кода.

Если бы я, чтобы исправить все такие части:

@IBOutlet var heightField: UITextField! //Renamed `Height` to `heightField` 
@IBOutlet var weightField: UITextField! //Renamed `Weight` to `weightField` 
@IBAction func calBMI(_ sender: AnyObject) { 
    if //Optional binding (using `if-let`) is the more preferred way than `!= nil` and forced unwrapping. 
     let heightText = heightField.text, 
     let weightText = weightField.text, 
     //You should not use `(... as AnyObject).doubleValue` to convert `String` to `Double` 
     //and should check if the text values are valid representation of Double 
     let myH = Double(heightText), 
     let myW = Double(weightText) 
    { 
     //This is the key point for the error "Cannot assign value of type 'Double' to 'String?'" 
     label.text = String(getBMI(h: myH, w: myW)) //You need to convert `Double` to `String` 
    } 
    else { 
     label.text = "Please enter your Height and Weight!" 
    } 
} 

//Renamed `GetBMI(H:W:)` to `getBMI(h:w:)` 
func getBMI(h: Double, w: Double) -> Double { 
    let height: Double = h/100 
    return w/(height * height) 
} 

Некоторые точки:

  • имена свойств должны представлять функцию контента. В вашем коде вы используете height и weight как Double значений, поэтому вам лучше назвать UITextField s (при условии, что Height и Weight - UITextField s) с чем-то другим. Я переименовал их в heightField и weightField.

  • Тестирования с != nil, а затем применять принудительное разворачивание (!) не является предпочтительным способом, лучше избегать использования ! как можно больше. Лучше использовать Дополнительное связывание - if-let.

  • Нельзя использовать (... as AnyObject).doubleValue для преобразования String в Double. Вы можете использовать инициализатор Double для преобразования String в Double (# 1). Что возвращает Optional<Double>, поэтому лучше их включить в if-let.

  • Вы не можете прямо присваивать Double значение объекта типа String?. Вы можете использовать инициализатор String для преобразования Double в String (# 1).

  • В Swift вы обычно используете капитализированный идентификатор только для типов, поэтому я переименовал GetBMI(H:W:) в getBMI(h:w:).

(# 1) Использование инициализаторов при преобразовании между String и Double является своим родом упрощенного вида. Этого может быть достаточно для создания BMI Calculator tutorial code, но может быть недостаточно для реальных приложений. Рассмотрите возможность использования NSNumberFormatter для реальных приложений.

Жирные линии являются обязательными или очень рекомендуемыми.

1
label.text = String(GetBMI(H: myH, W: myW)) 

Ваша функция возвращает double, label.text принимает только строку. Следовательно, вы получите сообщение об ошибке: Невозможно присвоить значение типа «Двойной» в «Строка?».

Знак вопроса в ошибке может отбросить вас. ? на 'String?' существует потому, что label.text МОЖЕТ быть пустым, поэтому его «необязательный», т. е. может иметь или не иметь значения. Напротив ! который явно объявляет, что есть значение и равен! = nil.

Смежные вопросы