Необязательный тип "Bool" не может использоваться как логическое значение; Вместо этого проверьте '!= Nil'

необязательный тип "Bool" не может использоваться как логическое значение; Вместо этого проверьте '!= Nil'

Сначала я получил ошибку if, заменив условие if (after), второе, если условие никогда не выполнялось. Любая идея?

До:

if(userEmail?.isEmpty || userPassword?.isEmpty || userRepeatPassword?.isEmpty){
      displayMyAlertMessage("All fields are required")
      return
}

if(userPassword != userRepeatPassword){
      displayMyAlertMessage("Passwords do not match.")
}

После:

if(userEmail != nil || userPassword != nil || userRepeatPassword != nil){
      displayMyAlertMessage("All fields are required")
      return
}

if(userPassword != userRepeatPassword){
      displayMyAlertMessage("Passwords do not match.")
}

4 ответа

Решение

Вы проверяете, отличается ли значение от нуля, и возвращаете, если оно есть, на основе ваших комментариев и вашего второго, если вы, вероятно, хотите проверить, является ли оно нулевым.

println("Checking login details")
if(userEmail.isEmpty || userPassword.isEmpty || userRepeatPassword.isEmpty){
      displayMyAlertMessage("All fields are required")
      println("Fail to login not all fields where fill") 
      return
} else if(userPassword != userRepeatPassword){
      displayMyAlertMessage("Passwords do not match.")
      println("Fail to login password does not match") 
} else {  
  var uiAlert = UIAlertController(title: "Alert", message: "Registration was successful", preferredStyle: UIAlertControllerStyle.Alert)
  self.presentViewController(uiAlert, animated: true, completion: nil)
  uiAlert.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { action in
   dismissViewControllerAnimated(true, completion:nil)
  }))
}

Вам нужно обернуть его ! вместо ?,
Это решит сообщение об ошибке:

if (username!.isEmpty) .....
if(userEmail!.isEmpty || userPassword!.isEmpty || userRepeatPassword!.isEmpty)

Вы не можете проверить значение необязательного, поскольку, как вы, вероятно, уже знаете, наличие необязательного подразумевает, что оно может или не может быть там. Одно решение называется force unwrapping и это делается с помощью "!" (восклицательный знак). "?" (знак вопроса) просто сообщает компилятору, что может быть или не быть значением, поэтому используйте "!" мы сообщаем компилятору, что мы знаем, что это может быть, а может и не быть значением внутри этой переменной, НО мы знаем, что она будет, даже если это ПУСТАЯ СТРОКА, в отличие от других языков программирования, которые рассматривают пустые строки или пустые массивы, такие как "ложь". Это не так быстро.

Ваше выражение внутри условного оператора ДОЛЖНО быть действительным логическим результатом.

С необязательными логическими значениями это работает немного по-другому, вам нужно явно проверить, имеет ли значение ноль. Так что именно поэтому ваш After: работает а не твой Before:

//now this is checking if your values are nil (empty) rather than not nil
//before if a user had valid fields, it would say that "All fields are required"
//now, this will work
if(userEmail == nil || userPassword == nil || userRepeatPassword == nil){
  displayMyAlertMessage("All fields are required")
} else if(userPassword != userRepeatPassword){
  displayMyAlertMessage("Passwords do not match.")
} else {
  //success
  //perform segue here to correct screen
}

Есть несколько вариантов того, как вы можете выполнить переход, я выберу presentViewController метод, см. ниже о том, как интегрировать это....

else {
  //success
  //perform segue here to correct screen
  presentViewController(yourMainScreenViewController, animated: true, completion: nil)
}

Вы также можете использовать executeSegueWithIdentifier("yourMainScreenIdentifier", sender: nil), если вы не используете presentViewController метод, как:

else {
  //success
  //perform segue here to correct screen
  performSegueWithIdentifier("yourMainScreenIdentifier", sender: nil)
}

Я добавлю в то, что я предполагаю, ваш displayMyAlertMessage является:

func displayMyAlertMessage(alert: String) {
  println(alert)
}
Другие вопросы по тегам