Подтвердить что ты не робот

Невозможно преобразовать тип выражения "[AnyObject]?" для ввода "NSArray"

После пересмотра кода, который, как представляется, работал с Xcode6 beta 5, я заметил, что получаю сообщение "Can not convert type type [AnyObject]?" для ввода ошибки "NSArray" для этой строки:

let textFields:NSArray = loginAlert.textFields as NSArray

Вот раздел кода, который кажется проблемой:

override func viewDidAppear(animated: Bool) {
    if PFUser.currentUser() == nil{
        var loginAlert:UIAlertController = UIAlertController(title: "Sign Up / Login", message: "Please sign up or login", preferredStyle: UIAlertControllerStyle.Alert)

loginAlert.addTextFieldWithConfigurationHandler({
            textfield in
            textfield.placeholder = "Your username"
        })

        loginAlert.addTextFieldWithConfigurationHandler({
            textfield in
            textfield.placeholder = "Your password"
            textfield.secureTextEntry = true
        })

        loginAlert.addAction(UIAlertAction(title: "Login", style: UIAlertActionStyle.Default, handler: {
            alertAction in
            let textFields:NSArray = loginAlert.textFields as NSArray
            let usernameTextfield:UITextField = textFields.objectAtIndex(0) as UITextField
            let passwordTextfield:UITextField = textFields.objectAtIndex(1) as UITextField            
        }))
}

Есть идеи, в чем проблема?

4b9b3361

Ответ 1

"Невозможно преобразовать тип выражения" [AnyObject]? "для ввода" NSArray"

Похоже, что loginAlert.textFields определяется как Необязательный и может быть nil, поэтому, если вы уверены, что его не nil - сначала распакуйте его, используя !:

loginAlert.textFields as AnyObject! as NSArray

или

loginAlert.textFields! as NSArray

Довольно простой пример на детской площадке:

var temp:Array<String>?  // define Optional array 

temp = Array<String>()   // well, we create new Array but since its optional we need set "!" each time during manipulation

temp!.append("val1") // 1st off we unwrap it and add new value

var newArray = temp as AnyObject! as Array<String> // to downcast to Array<String>, we unwrap it with AnyObject! first