Обрабатывать значение nil в Swift для NSString - PullRequest
0 голосов
/ 21 мая 2019

Следующий метод часто вызывается из файлов Objective-C (это смешанный проект Obj-C и Swift), и при определенных обстоятельствах я получаю нулевое значение для строки NSString, которая выдает исключение. Согласно этому сообщению Swift неявно преобразует строку NSString в строку без развертывания !. Как я могу обращаться с нулевым делом

Должен ли я использовать оператор if let? Если так, какой будет синтаксис? Я не могу заставить его работать.

@objc func download(surl: NSString, completion : @escaping (NSData) -> Void ) {

        guard let url = URL(string: String(surl)) else {
            //print("Can not get url with " , surl )
            return }

        let sessionConfig = URLSessionConfiguration.default
        let session = URLSession(configuration: sessionConfig, delegate: nil, delegateQueue: nil)


        let task = session.dataTask(with: url) { data, response, error in
            if let data = data, error == nil {
                let nsdata = NSData(data: data)
                DispatchQueue.main.async {
                    completion(nsdata)
                }
            } else {

               // print("Failure: %@", error?.localizedDescription);
            }
        }
        task.resume()
    }

1 Ответ

0 голосов
/ 21 мая 2019

Почему вы даже используете Objective-C типы с Swift? Вы могли бы просто использовать String вместо NSString и Data вместо NSData.

@objc func download(surl: String?, completion: ((Data?)->())?) {
    guard let str = surl, let url = URL(string: str) else {
        //print("Can not get url with " , surl )
        return
    }

    URLSession.shared.dataTask(with: url) { data, response, error in
        guard let data = data else {
            print(error?.localizedDescription)
            completion?(nil)
            return
        }
        DispatchQueue.main.async {
            completion?(data)
        }
    }.resume()
}

Кроме того, вы можете использовать URSession.shared объект, если нет особых требований к сети.

...