Почему я получаю ошибку, когда я делаю необязательную цепочку?

protocol textingprotocol : class {
    func didEnterText (text:String)
}

class secondViewController: UIViewController {    
weak var delegate:textingprotocol?

@IBOutlet weak var txtField: UITextField?

@IBAction func dismissButton(sender: UIButton) {

    delegate!.didEnterText(txtField?.text) // A: doesn't work
    delegate!.didEnterText(txtField?.text!) // B: doesn't work
    delegate!.didEnterText((txtField?.text)!) // C: works

}

A: Разве я не выполняю необязательную цепочку, и строка будет работать только в том случае, если текст имеет значение, если нет, то он будет корректно завершаться ошибкой? Все же это дает:

Значение необязательного типа 'String?' не развернутый; ты хотел использовать '!' или же '?'?

B: Даже когда мне сообщают об ошибке вышеупомянутого компилятора, я разворачиваю ее, но она не удовлетворена тем, что хочет, чтобы она была как C. Насколько я понимаю, ? Я развернул txtField и с ! Я развернул текст, все еще не понимая, почему он не работает

Почему работает C, а не B? Нет ли более чистого пути, чем линия С? Линия С выглядит очень непривлекательно.

1 ответ

Решение

didEnterText не берет String?, Требуется String, Таким образом, вы не можете использовать простую необязательную цепочку с вопросительными знаками, чтобы получить ее аргумент. Вы должны на самом деле развернуть к Stringне предварительно развернуть к String?-или-ноль.

Сейчас, txtField является необязательным, поэтому вам нужно развернуть его.

И UITextField's text свойство является необязательным, поэтому вам нужно развернуть его тоже.

Итак, самый простой подход - развернуть их обоих абсолютно:

    delegate!.didEnterText(txtField!.text!)

Если вы не хотите этого делать (потому что боитесь, что один из них будет нулевым и приведет к краху вашего приложения), вам придется защищать все это с помощью if let:

    if let s = txtField?.text {
        delegate!.didEnterText(s)
    }
Другие вопросы по тегам