【问题标题】:Handle nil value in Swift for NSString在 Swift 中为 NSString 处理 nil 值
【发布时间】:2019-05-20 23:13:05
【问题描述】:

从 Objective-C 文件(它是一个混合的 Obj-C 和 Swift 项目)中调用了很多以下方法,在某些情况下,我似乎得到了一个 NSString 的 nil 值,它抛出了一个异常。根据this post,Swift 隐式地​​将 NSString 转换为强制解包的 String!。如何处理 nil 的情况

我应该使用 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()
    }

【问题讨论】:

  • 我看到这段代码不会崩溃,但不能避免 nils 这在很大程度上取决于你的 url/data 的有效性
  • 你确定是 NSString 是 nil 而不是 URL 吗?我不会想到给定一个 NSString 参数是可能的——只有一个 optional NSString? value 应该被允许为 nil。也许你得到的字符串 (surl) 只是一个无效的 URL?
  • 按 string.count 如果您有 0 个计数,则字符串必须为空或 nil。所以你可以在你的代码中应用 string.count 来识别字符串 nil 与否。

标签: ios swift nsstring optional


【解决方案1】:

你为什么还要使用Objective-C 类型和Swift?您可以简单地使用String 而不是NSStringData 而不是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 对象。

【讨论】:

  • 该方法是从 Obj-C 文件中调用的...我更改了问题以显示这一点,我们还使用 NSString 索引下载的文件,我认为您不能使用 String 来执行此操作。但是,将 NSString 更改为 String 可能是答案。会努力让它发挥作用。
猜你喜欢
  • 2016-01-21
  • 2020-08-08
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 2015-07-15
  • 1970-01-01
相关资源
最近更新 更多