Вы можете найти некоторые темы, описывающие, как исправить Невозможно присвоить значение типа «двойной» на «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
для реальных приложений.
Жирные линии являются обязательными или очень рекомендуемыми.