Хорошо, что вы проверяете ошибку в отладчике (дебютанты делают это не часто).
Не удалось привести значение типа '__NSCFString' (0x1032a04f0) к 'NSURL'
(0x1032a21b0).
Давайте переведем это:
В какой-то момент в вашем коде вы пытаетесь преобразовать объект NSString
(это часть __NSCFString
) в NSURL
. Это означает, что вы пытаетесь сообщить компилятору, что эта строка может быть NSURL, и она говорит вам НЕТ во время выполнения.
Вот строка: (pdf as? URL)!
Спросите вас об этом:
Может ли объект String
быть переведен как объект URL
? Можно ли UIImage
перевести как CBPeripheral
?
Нет, не совсем.?
Классы / структуры имеют значение, различную цель и различное использование.
Быстрое исправление:
let pdfURLString = eCataLogList[indexPath.row]["pdf_file"] //So that's a String
let pdfURL = URL.init(string: pdfURLString)
let request = NSURLRequest(url: pdfURL!)
Теперь давайте рассмотрим еще ваш код:
Избегайте использования NSStuff, когда есть версия "Swift": NS(Mutable)URLRequest
=> URLRequest
и т. Д. Конечно, вы можете использовать мосты и привести как URLRequest
в NSURLRequest
и наоборот , но обратите внимание, что в вашем текущем коде вы делаете NSURLRequest
до URLRequest
, в то время как вы могли бы использовать URLRequest с самого начала. Это просто добавляет шумы, чтобы делать каждый раз as
.
Избегайте принудительного разворачивания, когда это возможно, это использование !
. Если это не удается (это ноль), он потерпит крах. Вместо этого используйте guard let
или if let
guard let view: PDFViewController = self.storyboard?.instantiateViewController(withIdentifier: "PDFViewController") as? PDFViewController else {
print ("Error in initializing the PDFViewController")
return
}
let pdfURLString = eCataLogList[indexPath.row]["pdf_file"]
if let pdfURL = URL.init(string: pdf) {
let request = URLRequest(url: pdfURL)
view.pdf_web.loadRequest(request)
self.navigationController?.pushViewController(view, animated: true)
} else {
print("Ooops, \(pdfURLString ?? "pdfURLString for row \(indexPath.row)") doesn't seem to be a valid URL")
}
Примечание:
Я явно написал URL.init(string: someURLString)
, но вы можете написать URL(string: someURLString)
.