Нет точных совпадений при вызове сообщения об ошибке инициализатора в swift - PullRequest
2 голосов
/ 07 мая 2020

Я запуталась. Не мог бы кто-нибудь сказать мне, почему я получаю ошибку «Нет точных совпадений при вызове инициализатора», когда у меня есть этот код ....

    let bill = textField.text
    let billTotal = Double(bill)

, но когда я принудительно развернул textField.text, ошибка исчезла и все хорошо ...

    let bill = textField.text!
    let billTotal = Double(bill)

Я считаю, что он все равно должен работать без принудительного развертывания, но приложение будет sh трещать, если textField равен нулю.

Кроме того, почему я не могу использовать необязательный параметр вместо принудительного развертывания?

 let bill = textField.text?
 let billTotal = Double(bill)

Использование необязательного элемента дает мне ту же ошибку: «Нет точных совпадений при вызове инициализатора»

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Ошибка возникает из-за того, что text является необязательным, а параметр инициализатора должен быть необязательным.

Я считаю, что он все равно должен работать без принудительного развертывания, но приложение будет трещать sh если textField равно nil.

В этом случае принудительное развертывание допустимо, потому что свойство text объекта UITextField никогда не равно nil, хотя оно объявлено как необязательное.

Но вместо этого вы должны проверить созданный Double, потому что введенный текст может быть не преобразован в Double, либо со значением по умолчанию

let billTotal = Double(textField.text!) ?? 0.0

, либо с более сложной обработкой ошибок

if let billTotal = Double(textField.text!) {
    // do something with billTotal
} else {
    // handle the error
}
1 голос
/ 07 мая 2020

textField.text уже является необязательным ... вы можете сделать

 if let bill = textField.text {
      let billTotal = Double(bill)
      }

Также вы можете сделать это, предложив @Jessy Спасибо ...

let billTotal = textField.text.flatMap(Double.init)

Чтобы преобразовать в Double .. его инициализатор принимает S : StringProtocol, что подтверждает StringProtocol ... Только типы String и Substring в стандартной библиотеке являются допустимыми соответствующими типами, а не Optional String

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...