我正在尝试连接服务器
如果你有解决方案,请为我写下来
我怎么知道更新版本的swift有哪些变化?
swift 2和swift 3之间存在很多差异
swift 4与swift 3有很大不同吗?
在swift 3中我收到此错误:
let task = URLSession.shared.dataTask(with: server.execute())
{Data,URLResponse,error in
if error != nil{
print(error as Any)
return
}
do{
let json = try JSONSerialization.jsonObject(with: Data!, options: .allowFragments)
if let json_result = json as? [String: Any]
{
let result = json_result ["result"] as? String
if result == "0"
{
DispatchQueue.main.async {
let alert = UIAlertController(title:"Incorrect Username",message : "The username you entered doesn't appear to belong to an account. Please check your username and try again", preferredStyle : .alert)
let alert_action = UIAlertAction(title: "Try Again", style: .default, handler: nil)
alert.addAction(alert_action)
self.present(alert, animated: true, completion: nil)
}
}
else
{
DispatchQueue.main.async {
UserDefaults.standard.set(result!, forKey: "user_id")
//" use of unresolved identifier 'result' "
let current_view=UIApplication.shared.windows[0] as UIWindow
let new_view=(self.storyboard? .instantiateViewController(withIdentifier: "tab_bar"))! as UIViewController
UIView.transition(from: (current_view.rootViewController? .view)!, to:new_view.view , duration: 0.65, options: .transitionFlipFromRight, completion: {(action) in current_view.rootViewController=new_view
})
}
}
}
else{
// Error in jsonSerialization
} }
catch{
}
}
task.resume()
答案 0 :(得分:0)
问题几乎肯定是server.execute()
的回报值。也许它是NSURL
或NSURLRequest
而不是URL
或URLRequest
。也许它是可选的。也许它完全不同。最重要的是,如果dataTask
的参数不是非可选URL
或URLRequest
,您可以得到错误。如果没有看到execute
返回的内容,我们只是猜测,但它可能是罪魁祸首。
几个不相关的观察结果:
我不会将Data
或URLResponse
用作dataTask
闭包的参数名称。这些是数据类型的名称。我会使用data
和response
(或者甚至不指定response
,因为您不使用它),而是为了避免混淆(对于您和编译器)。
你有很多无关的演员,只会给代码增加噪音。例如。 windows
是UIWindow
的数组,所以当您从该数组中获取第一项时,为什么还要费心as UIWindow
。
您有几个可选的链接序列,您稍后会强制解包。这样做没有意义。消除该过程中的可选链接。因此,而不是storyboard?
后跟!
:
let new_view = (self.storyboard?.instantiateViewController(withIdentifier: "tab_bar"))! as UIViewController
您可以使用storyboard!
:
let controller = self.storyboard!.instantiateViewController(withIdentifier: "tab_bar")
如果您愿意,您可以删除几个无关的选项。例如。 .allowFragments
JSONSerialization
是不必要的(也可能是不受欢迎的)。或者completion
和nil
的{{1}} UIAlertAction
也是不必要的。没什么大不了的,但它只会给代码增加噪音。
按照惯例,我们不会使用present
字符来分隔变量名称中的字词。我们使用camelCase。因此,例如,我们使用_
而不是current_view
。 (或者,因为那是一个窗口,我实际上使用currentView
,这更简单。)
如果你在window
块中没有做任何事情,那么使用do
- try
- catch
模式是没有意义的。如果你在捕获它时不会做任何事情,为什么会抛出错误。如果您关心的是否成功,只需使用catch
。
因此,可以将代码清理一下,例如:
try?
现在,我已将let task = URLSession.shared.dataTask(with: request) { data, _, error in
if let error = error {
print(error)
return
}
guard let data = data,
let json = (try? JSONSerialization.jsonObject(with: data)) as? [String: Any],
let result = json["result"] as? String else {
print("no result")
return
}
DispatchQueue.main.async {
if result == "0" {
let alert = UIAlertController(title: "Incorrect Username", message: "The username you entered doesn't appear to belong to an account. Please check your username and try again", preferredStyle: .alert)
let action = UIAlertAction(title: "Try Again", style: .default)
alert.addAction(action)
self.present(alert, animated: true)
} else {
UserDefaults.standard.set(result, forKey: "user_id")
let window = UIApplication.shared.windows[0]
let controller = self.storyboard!.instantiateViewController(withIdentifier: "tab_bar")
UIView.transition(from: window.rootViewController!.view, to: controller.view, duration: 0.65, options: .transitionFlipFromRight, completion: { _ in
window.rootViewController = controller
})
}
}
}
task.resume()
替换为server.execute()
,因为我不知道request
正在做什么,但请使用适当的内容(请参阅此开头)回答)。