为 NSString 处理 Swift 中的 nil 值
Handle nil value in Swift for NSString
下面的方法从 Objective-C 文件(它是一个混合的 Obj-C 和 Swift 项目)中调用了很多,在某些情况下,我似乎得到了一个抛出的 NSString 的 nil 值一个例外。根据 this post Swift 将 NSString 隐式转换为强制展开的 String!。我如何处理零案例
我应该使用 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()
}
为什么还要将 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
对象。
下面的方法从 Objective-C 文件(它是一个混合的 Obj-C 和 Swift 项目)中调用了很多,在某些情况下,我似乎得到了一个抛出的 NSString 的 nil 值一个例外。根据 this post Swift 将 NSString 隐式转换为强制展开的 String!。我如何处理零案例
我应该使用 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()
}
为什么还要将 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
对象。