Пожалуйста, используйте нижний корпус верблюда для переменных ...
В этой строке:
var grades:[Double] = [Input]
Input
является экземпляром UITextField
, так что вы пытаетесь присвоить один-элемент Array<UITextField>
в Array<Double>
. Вы видите, что вы не можете делать такие вещи.
Если вы хотите, чтобы принять текст, который содержит чисел, разделенных запятыми, вам необходимо явно преобразовать text
[Double]
в.
Чтобы упростить, давайте просто проигнорируем nil
или нечисловые значения. Тогда вам необходимо изменить свой код, как:
@IBOutlet var input: UITextField!
@IBOutlet var output: UILabel!
@IBAction func calculate(sender: AnyObject) {
var grades: [Double] = (input.text ?? "").componentsSeparatedByString(",").flatMap{Double($0)}
func average(nums: [Double]) -> Double {
var total = 0.0
for grade in nums{
total += Double(grade)
}
let gradesTotal = Double(nums.count)
let average = total/gradesTotal
return average
}
let averageValue = average(grades)
output.text = "Average: \(averageValue)"
}
Основная идея этой линии:
var grades: [Double] = (input.text ?? "").componentsSeparatedByString(",").flatMap{Double($0)}
хорошо описанный в ответ Lu_ в. Шахта - это немного более безопасная версия.
(Дополнение) Некоторые пояснения по поводу безопасности:
UITextField
свойству объекта text
имеет тип String?
, так что вы должны думать, что может быть равен нулю. Дает значение по умолчанию для nil с оператором ??
.
И с помощью Double($0)!
может произойти сбой приложения, так как Double($0)
вернет нуль для нечисловых строк.
Письмо это напомнило мне еще один случай аварии.
Когда gradesTotal
== 0, код, указанный выше, сработает с делением на ноль.
(Значение default
не работает хорошо для «безопасности» в приведенном выше коде ...)
Таким образом, еще один шаг вперед к безопасности:
@IBAction func calculate(sender: AnyObject) {
var grades: [Double] = (input.text ?? "").componentsSeparatedByString(",").flatMap{
Double($0.stringByTrimmingCharactersInSet(.whitespaceCharacterSet()))
}
func average(nums: [Double]) -> Double? {
var total = 0.0
for grade in nums{
total += Double(grade)
}
let gradesTotal = Double(nums.count)
if gradesTotal > 0 {
let average = total/gradesTotal
return average
} else {
return nil
}
}
if let averageValue = average(grades) {
output.text = "Average: \(averageValue)"
} else {
output.text = "Average not available"
}
}
использовать 'Double (Input.text)'. Вы прямо сейчас назначаете объект текстового поля, чтобы удвоить –