Приложение не обрабатывает sh, когда я печатаю строку, но делает, когда я отображаю ее в метке - PullRequest
0 голосов
/ 17 апреля 2020

это мой первый вопрос, и я новичок в Swift

Для некоторого фона: я делаю приложение, которое получает HTML со страницы, декодирует его, а затем отображает. Я уже выяснил, как получить HTML и декодировать его, но когда я пытаюсь отобразить его, он выдает следующее сообщение об ошибке: Неустранимая ошибка: неожиданно обнаружил ноль при развертывании необязательного значения. Я действительно запутался, потому что он может печатать декодированный HTML в консоли. Вот мой код (1-я страница, на которой происходит сбой при попытке отобразить строку HTML, 2-я - там, где HTML извлекается и декодируется):


class LatinViewController: UIViewController {

    @IBOutlet weak var textLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        textLabel.sizeToFit()
        textLabel.text = "Loading..."
    }

    func getLabel(get label: String) {
        print(label)
        textLabel.text = label
    }
}
import Foundation

struct SearchBrain {

    let latinViewController = LatinViewController()
    let englishViewController = EnglishViewController()

    func makeLatinURL(get latinWord: String) {

        if let url = URL(string: "http://archives.nd.edu/cgi-bin/wordz.pl?keyword=\(latinWord)") {
            getContents(use: url, sender: K.senderLatin)
            print(url)
        } 
    }


    func makeEnglishURL(get englishWord: String) {

        if let url = URL(string: "http://archives.nd.edu/cgi-bin/wordz.pl?english=\(englishWord)") {
            getContents(use: url, sender: K.senderEnglish)
        }
    }

    // This gets the Html from WWW and decodes it
    func getContents(use url: URL, sender: String) {
        DispatchQueue.global().async {
            do {
                let contents = try String(contentsOf: url)
                // print("This is the encoded string: \(contents)")
                if let decodedString = String(htmlEncodedString: contents) {
                   //  print("This is the decoded string: \(decodedString)")
                    if sender == K.senderLatin {
                        self.latinViewController.getLabel(get: decodedString)
                    } else if sender == K.senderEnglish {
                        self.englishViewController.getLabel(get: decodedString)
                    }
                }
            } catch {
                print("There was an error getting the cotents of WWW: \(error)")
            }
        }
    }
}

extension String {

    init?(htmlEncodedString: String) {

        guard let data = htmlEncodedString.data(using: .utf8) else {
            return nil
        }

        let options: [NSAttributedString.DocumentReadingOptionKey: Any] = [
            .documentType: NSAttributedString.DocumentType.html,
            .characterEncoding: String.Encoding.utf8.rawValue
        ]

        guard let attributedString = try? NSAttributedString(data: data, options: options, documentAttributes: nil) else {
            return nil
        }

        self.init(attributedString.string)
    }

}

Спасибо заранее!

...