我正在尝试使用Swift 5获取此数据
<//controller class for user interface>
class UserDetailsViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//call service to get user details
BaseBusiness.getUserDetails() { response in
//Response object
print(response)
}
}
}
[在Swift 5中运行正常。我更新到Swift 5,它破坏了代码。我读了几篇SO,但是我仍然很难理解它。我应用了一些建议,包括Swift 5中的JSON解析,但是我仍然无法解决出现的错误。
> **business class where write business logic**
class BaseBusiness {
static func getUserDetails(Completion:@escaping([UserModelElement])->Void){
let urlStringctr1 = Constant.UserUrl
UserDetailService.getPosts(str: urlStringctr1) { (Response) in
let objitemBo = Response
print(objitemBo)
Completion(objitemBo)
}
}
}
As of Swift 5, you need to do a cast early on.
为特定api提供的用户服务
class UserDetailService {
private init(){}
//create static method to call request to server
static func getPosts(str:String, Completion:@escaping([UserModelElement])->Void){
//converting string to encodable url format
let urlStr:NSString = str.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! as NSString
//passing request
guard let url = URL(string:urlStr as String) else { return }
//call main service to parse data
NetworkingServices.shared.getData(FromUrl: url) { (RespData) in
do{
// decoding data
let decoder = JSONDecoder()
let codabledata = try decoder.decode([UserModelElement].self, from: RespData)
//print information on console
print(codabledata)
//return back object by clouser
Completion(codabledata)
}catch let parsingError {
print("Error", parsingError)
}
}
}
}
这是因为JSONSerialization现在返回Any,这没有实现[]运算符的变体。请确保您安全地解开演员表,并采取常见措施以确保不会使程序崩溃。
网络服务作为基本服务类
lass NetworkingServices {
//empty initialization
private init(){}
static let shared = NetworkingServices();
//calling service method
func getData(FromUrl:URL,Completion:@escaping(Data)->Void) {
//create session object
let session = URLSession.shared
let task = session.dataTask(with: FromUrl) { (data, response, error) in
//getting response
guard let respdata = data else {return}
DispatchQueue.main.async {
Completion(respdata)
}
}
task.resume()
}
}
是。还要考虑对数据变量执行相同的操作,除非您100%确信它永远不会为空(如果使用网络,则永远不会100%确定)。 — — Andy Ibanez 16年9月12日在22:28正如我在问题显示中上面的代码中的注释部分,我得到了“用于条件绑定的Initializer必须具有可选类型,而不是'[String:Any]'”错误。我再次使用相同的错误得到相同的错误。难道我做错了什么? – user1828605 '16 Sep 12在22:45在您的try语句是否仍然有问号?您不需要它,但是如果您放了它,则需要做json?[“ expertPainPanels”] – Andy Ibanez 16年9月12日在22:49我意识到我要告诉你的东西与你的东西相似评论,但对我来说编译很好
func getDataFromServer(FromUrl:URL,Completion:@escaping(Data)->Void) {
var request = URLRequest(url: FromUrl)
request.httpMethod = "GET"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.addValue("91", forHTTPHeaderField: "UserCode")
request.addValue("17.461365", forHTTPHeaderField: "Latitude")
request.addValue("78.369583", forHTTPHeaderField: "Longitude")
request.addValue("en", forHTTPHeaderField: "LanguageType")
request.addValue("91", forHTTPHeaderField: "ISDCode")
request.addValue(AppDelegate.phoneNo, forHTTPHeaderField: "MobileNumber")
//request.addValue("Guest", forHTTPHeaderField: "Token")
let configuration = URLSessionConfiguration.default
let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main)
let task = session.dataTask(with: request, completionHandler: {(data, response, error) -> Void in
if (error != nil) {
print("Error: \(error ?? "" as! Error)")
}
else {
guard let jsonData = data else{return}
if let JSONString = String(data: jsonData, encoding: String.Encoding.utf8)
{
print("Response: \(JSONString)")
}
Completion(jsonData)
}
})
task.resume()
}
static func saveDriverRequestToStore(IsAutoRequest : Bool,arrStore : [Int], Completion:@escaping(GetOTPModel)->Void){
let urlStringctr = "http://app_dev_driver.baqalaexpress.net/DriverApi/api/baqaladriverapi/SaveDriverRequestToStore"
let dict:[String:Any] = ["IsAutoStoreRequest": IsAutoRequest, "StoreIds": arrStore]
NetworkingServices.shared.postRequestToServer(module: urlStringctr, parameters: dict)
{ (RespData) in
do{
let decoder = JSONDecoder()
let codabledata = try decoder.decode(GetOTPModel.self, from: RespData)
print(codabledata)
Completion(codabledata)
}catch let parsingError {
print("Error", parsingError)
}
}
}
func postRequestToServer(module:String,parameters:[String:Any],completion:@escaping (Data)-> Void){
let jsonData = try? JSONSerialization.data(withJSONObject: parameters, options: [])
var request = URLRequest(url: URL(string: module)!)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.addValue("91", forHTTPHeaderField: "UserCode")
request.addValue("17.461365", forHTTPHeaderField: "Latitude")
request.addValue("78.369583", forHTTPHeaderField: "Longitude")
request.addValue("en", forHTTPHeaderField: "LanguageType")
request.addValue("91", forHTTPHeaderField: "ISDCode")
request.addValue(AppDelegate.phoneNo, forHTTPHeaderField: "MobileNumber")
request.addValue("Guest", forHTTPHeaderField: "Token")
request.httpBody = jsonData
let configuration = URLSessionConfiguration.default
let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main)
let task = session.dataTask(with: request, completionHandler: {(data, response, error) -> Void in
if (error != nil) {
print("Error: \(error ?? "" as! Error)")
}
else {
guard let jsonData = data else{return}
if let JSONString = String(data: jsonData, encoding: String.Encoding.utf8) {
print("Response: \(JSONString)")
}
completion(jsonData)
}
})
task.resume()
}