URL (строка:) дает нулевую ошибку, даже если строка не равна нулю в Swift

У меня есть следующий код:

print("CODE STRING SELECTED: \(codeString)")
let aURL = URL(string: codeString)!
if UIApplication.shared.canOpenURL(aURL) { UIApplication.shared.openURL(aURL) }

Этот код находится внутри кнопки, и консоль Xcode правильно печатает codeString, это не nil, и поэтому он должен открывать URL-адрес codeString, вместо этого Xcode выдает эту ошибку:

CODE STRING SELECTED: mailto:[email protected]?subject=Subject here&body=Lorem ipsum dolor sit, amet quatum.

Fatal error: Unexpectedly found nil while unwrapping an Optional value
2019-07-08 11:19:56.076467+0200 QRcode[2751:1043394] Fatal error: Unexpectedly found nil while unwrapping an Optional value

То же самое происходит в случае номера телефона или строки SMS (я получаю значение codeString из отсканированного QR-кода):

CODE STRING SELECTED: tel:+1 2345678901
Fatal error: Unexpectedly found nil while unwrapping an Optional value

CODE STRING SELECTED: SMSTO:+1012345678:lorem ipsum dolor sit, amet
Fatal error: Unexpectedly found nil while unwrapping an Optional value

В случае URL-адреса, такого как https//example.com, приложение не падает, нет нулевой ошибки, то же самое для текста и т. д. Поэтому я действительно не понимаю, почему я получаю эту ошибку, даже если codeString не nil .

Рассматривали ли вы создание сторожевого разрешения, чтобы подтвердить, что он не равен нулю к тому времени, когда вы к нему обращаетесь?

Brandon Stillitano 08.07.2019 11:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
521
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Строка не является nil, но она не представляет собой допустимый URL-адрес. Вы должны закодировать URL.

Однако рекомендуется безопасно разворачивать опции.

if let encodedString = codeString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed),
   let aURL = URL(string: encodedString), UIApplication.shared.canOpenURL(aURL) { 
    UIApplication.shared.openURL(aURL) 
}

Вы правы, @vadian, большое спасибо за помощь, я приму ваш ответ

Frank Eno 08.07.2019 11:44

Замечательное решение!

devios 10.02.2022 05:10

URL-адрес nil, потому что он не может быть создан без экранирования пробелов, которые вы там получили.

Это будет работать:

guard let escapedString = codeString.addingPercentEncoding(withAllowedCharacters: urlQuoeryAllowed), 
      let url = URL(string: escapedString) else {
 return
}

Другие вопросы по теме