2015-07-24 5 views
-1

Я начинаю учиться быстро, но столкнулся с ошибкой. Ive просто создал очень простое приложение из курса, который я следую, который вычисляет возраст кошек на основе того, что вводит пользователь. Первая версия приложения просто раз вводит пользователя на 7, и мне не удалось справиться с проблемой. Я думал, что у меня будет играть с тем, что я написал, и изменить его TODO это:Swift: Невозможно присвоить значение типа 'int' значению типа 'int?' Ошибка

  • первый человек в год = 15 кошачьи лет
  • второй человек в год = +10
  • третий человек в год = +4
  • четвёртых людей в год = +4
  • пятого человек в год = +4

так далее ..

, например. 4-летняя кошка будет 33 года в кошачьих годах.

Так что я хочу, чтобы мои результаты этикетки сказать, что вы кошка в кошки лет 33

Это код, который я написал:

@IBAction func findAge(sender: AnyObject) { 

    var enteredAge = enterAge.text.toInt() 

    if enteredAge = 1 { 

     var catYears = 15 

     resultLabel.text = "You're cat is \(catYears) in cat years" 

    } else if enteredAge = 2 { 

     var catYears = 25 

     resultLabel.text = "You're cat is \(catYears) in cat years" 

    } else { 

     var catYears = (15 + 25) + (enteredAge - 2) * 4 

     resultLabel.text = "You're cat is \(catYears) in cat years" 

    } 

} 

@IBOutlet weak var enterAge: UITextField! 


@IBOutlet weak var resultLabel: UILabel! 

Эта ошибка, я получаю на строка 17 ", если введена Age = 1 {" она заявляет это "не может присвоить значение типа 'int' значению типа 'int?'"

Я не совсем понимаю, почему это значение не может быть целым числом, любая помощь была бы большой.

+0

Сравнение в Swift выполняется с '==', а не с '='. –

+0

фантастический! Спасибо! – JPC12

ответ

2

Основная ошибка (as I said in a comment) является то, что вы перепутали оператор присваивания = и оператор равенства==.Сравнение должно быть

if enteredAge == 1 { ... } 

Следующая проблема (as keithbhunter already stated in his answer), toInt() возвращает опциональный который nil, если строка не является действительным числом, и вы должны использовать дополнительное связывание:

if let enteredAge = enterAge.text.toInt() { 
    // compute cat years ... 
} else { 
    // report invalid input ... 
} 

Дополнительные примечания:

  • Все ваши переменные в этом методе могут быть объявлены как константы с let.
  • Имеются 3 идентичных задания resultLabel.text = ..., это может быть упрощено .
  • Вместо if ... else if ... else вы можете использовать инструкцию switch.

Тогда ваш метод будет выглядеть следующим образом:

if let enteredAge = enterAge.text.toInt() { 
    let catYears : Int 
    switch(enteredAge) { 
    case 1: 
     catYears = 15 
    case 2: 
     catYears = 25 
    default: 
     catYears = (15 + 25) + (enteredAge - 2) * 4 
    } 
    resultLabel.text = "You're cat is \(catYears) in cat years" 
} else { 
    resultLabel.text = "Please enter a valid number" 
} 

В качестве альтернативы можно использовать условный оператор ?: (иногда называемый также тройная оператор):

if let enteredAge = enterAge.text.toInt() { 
    let catYears = enteredAge == 1 ? 15 : 
       enteredAge == 2 ? 25 : (15 + 25) + (enteredAge - 2) * 4 
    resultLabel.text = "You're cat is \(catYears) in cat years" 
} else { 
    resultLabel.text = "Please enter a valid number" 
} 
1

Я не совсем уверен в методе toInt(), но я собираюсь угадать, что метод возвращает Int?. Это означает, что он может вернуть nil, если он не может преобразовать строку в int. Вы должны развернуть это значение, чтобы обрабатывать nil-файлы.

if var enteredAge = enterAge.text.toInt() { 
    // the rest of the code 
} 
+0

Хорошо, я пробовал это, но у меня другая ошибка, но в той же строке. «Нельзя присвоить неизменяемое значение типа« int » – JPC12

1

Вы уже назначили значение переменной enteredAge как следующим образом:

var enteredAge = enterAge.text.toInt() 

Таким образом, вы не можете сделать назначение на место этого, если выражение. и вам нужно условие на выражение if следующим образом.

if enteredAge == 1 { 

    var catYears = 15 

    resultLabel.text = "You're cat is \(catYears) in cat years" 

} 

Это может вам помочь.

0

должно выглядеть следующим образом:

@IBAction func button(sender: AnyObject) { 
    var inputYears = textField.text.toInt()! 
    if inputYears == 1 { 
    var catOld = 15 
    result.text = "Your cat is \(catOld) years old" 
    } 
    else if inputYears == 2 { 
    var catOld = 25 
    result.text = "Your cat is \(catOld) years old" 
    } 
    else {var catOld = (15+25) + (inputYears - 2)*4 
    result.text = "Your cat is \(catOld) years old" 
    } 
Смежные вопросы