【问题标题】:Swift 3 - URLRequest creation crashesSwift 3 - URLRequest 创建崩溃
【发布时间】:2016-06-18 17:14:42
【问题描述】:
        let url = URL(string: "\(SERVER_HOST)/post?fb_id=\(fb_user)")
        var request = URLRequest(url: url!) // Crashes here

        Alamofire.request(request)
            .responseJSON { response in
                switch response.result {
                case .failure(let error):
                    onComplete(success: false)
                case .success(let responseObject):
                    onComplete(success: true)
                }
        }

崩溃错误:

致命错误:在展开可选值时意外发现 nil

它在 Swift 3 之前就有效。
它是 NSURLRequest 并且有效。我该怎么做才能修复它?

【问题讨论】:

  • 什么是SERVER_HOST,什么是fb_user,什么是url(可能是nil) - 什么是组装字符串?您可能希望将 url 创建分成两条语句,一条用于创建字符串,一条用于将整个字符串传递给 URL(...)
  • 例如,SERVER_POST 是否包含方案(http://https://)。另外,fb_user 是什么?它可能是一个可选的(除非你打开它会导致问题)? SERVER_POSTfb_user 是否有任何保留字符(例如空格)?与我们分享完整的 URL 字符串。
  • @Rob 你说得对,非常感谢! Swift 3 使 (fb_user) 成为可选的。

标签: ios nsurlrequest urlrequest swift3 xcode8


【解决方案1】:

好吧,解决方案是添加 !在字符串格式中的每个变量之后,以使其非可选。

let stringUrl = "\(SERVER_HOST)...\(FBUser.id!)..."

【讨论】:

  • 如果这些属性永远不会为零,最好将它们设为非可选。
【解决方案2】:

URL(string:"urlstring") 返回一个可选值,当它的值为 nil 时,您将在下一行强制展开,您应该像这样使用 guard letif let

guard let url = URL(string: "\(SERVER_HOST)/post?fb_id=\(fb_user)") else {
   return
}
var request = URLRequest(url: url)
Alamofire.request(request)
            .responseJSON { response in
                switch response.result {
                case .failure(let error):
                    onComplete(success: false)
                case .success(let responseObject):
                    onComplete(success: true)
                }
        }

或者你可以使用 if let

if let url = URL(string: "\(SERVER_HOST)/post?fb_id=\(fb_user)") {
   var request = URLRequest(url: url!)
   // and rest of the code
   Alamofire.request(request)
            .responseJSON { response in
                switch response.result {
                case .failure(let error):
                    onComplete(success: false)
                case .success(let responseObject):
                    onComplete(success: true)
                }
        }
}

如果你没有做任何其他事情,那么在开始时使用 guard let 返回。

您可以阅读有关 swift 基础知识和可选的here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多