Ответ 1
Это не urlSafeBody
, то есть nil. Как вы можете видеть из инструкции print, она содержит необязательную строку:
URLSAFEBODY: необязательный ( "привет" )
Это на самом деле окажется проблемой для цепочки в следующем утверждении, поскольку вы не развернули эту строку до того, как она будет интерполирована.
Если вы проверили свой URL-адрес NSURL
, вы увидите, что он содержит:
смс: & тело = Опционно ( "Привет" )
Это приведет к сбою инициализации NSURL
, потому что его строковый URL-адрес неверен. Затем происходит фатальная ошибка, потому что вы принудительно распаковываете нулевой результат из NSURL(string:)
Как решить эту проблему:
Вы хотите условно развернуть любые строки, которые могут быть нулевыми. Вы можете сделать это с помощью if let
или guard let
необязательной привязки:
let messageBody = "hello"
let urlSafeBody = messageBody.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
if let urlSafeBody = urlSafeBody, url = NSURL(string: "sms:&body=\(urlSafeBody)") {
WKExtension.sharedExtension().openSystemURL(url)
}
Обратите внимание, что urlSafeBody
был развернут до того, как он был использован в строковой интерполяции, а url
также был распакован после инициализации.
Поскольку он уверен, что url не равен nil, его можно безопасно передать в openSystemURL
.
Вы всегда должны стремиться избегать переменных развертки, которые могут быть нулевыми, поскольку это, безусловно, приведет к сбою.