Почему я получаю ошибку, когда я делаю необязательную цепочку?
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)
}