Подтвердить что ты не робот

SMS-чат WatchKit с предустановленным корпусом

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

let messageBody = "hello"
let urlSafeBody = messageBody.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
print("URLSAFEBODY: \(urlSafeBody)")
WKExtension.sharedExtension().openSystemURL(NSURL(string: "sms:&body=\(urlSafeBody)")!)

Когда этот код выполняется, я получаю сообщение о том, что необязательный urlSafeBody был отключен силой, а nil, что привело к сбою. Почему urlSafeBody нет? Я знаю, что я могу развернуть его, но я не понимаю, почему он когда-либо назначается явно.

4b9b3361

Ответ 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.

Вы всегда должны стремиться избегать переменных развертки, которые могут быть нулевыми, поскольку это, безусловно, приведет к сбою.