2016-11-06 67 views
0

在Swift 3.0中,我有以下用于生成URLRequest的throws函数。asURLRequest Alamofire尝试错误

func asURLRequest() throws -> URLRequest { 

     let result: (path: String, parameters: [String: AnyObject]?) = try { 
      switch self { 
      case .PopularPhotos (let userID, let accessToken): 
       let params = try ["access_token": accessToken] 
       let pathString = try "/v1/users/" + userID + "/media/recent" 
       return try (pathString, params as [String : AnyObject]?) 

      case .requestOauthCode: 
       let pathString = try "/oauth/authorize/?client_id=" + Router.clientID + "&redirect_uri=" + Router.redirectURI + "&response_type=code" 
       return try (pathString, nil) 

      default: break 

      } 
     }() 

然而,当我去调用该函数:

let request = Instagram.Router.requestOauthCode.asURLRequest() 

我得到以下错误:“呼叫可以抛出,但没有打上‘尝试’,而不是处理的错误。

我已经看过几个教程到错误处理和投掷功能雨燕3.0,我无法弄清楚如何在这里处理错误

完整的类代码如下:

struct Instagram { 

enum Router: URLRequestConvertible { 
    static let baseURLString = "https://api.instagram.com" 
    static let clientID = "cf97d864faf14f90a1557c4b972c990e" 
    static let redirectURI = "http://www.example.com/" 
    static let clientSecret = "7f1ce6147f924afc92dea31f5354ca06" 

    case PopularPhotos(String, String) 
    case requestOauthCode 

    static func requestAccessTokenURLStringAndParms(code: String) -> (URLString: String, params: [String: AnyObject]) { 
     let params = ["client_id": Router.clientID, "client_secret": Router.clientSecret, "grant_type": "authorization_code", "redirect_uri": Router.redirectURI, "code": code] 
     let pathString = "/oauth/access_token" 
     let urlString = Instagram.Router.baseURLString + pathString 
     return try (urlString, params as [String : AnyObject]) 
    } 
    // MARK: URLRequestConvertible 

    func asURLRequest() throws -> URLRequest { 

     let result: (path: String, parameters: [String: AnyObject]?) = try { 
      switch self { 
      case .PopularPhotos (let userID, let accessToken): 
       let params = try ["access_token": accessToken] 
       let pathString = try "/v1/users/" + userID + "/media/recent" 
       return try (pathString, params as [String : AnyObject]?) 

      case .requestOauthCode: 
       let pathString = try "/oauth/authorize/?client_id=" + Router.clientID + "&redirect_uri=" + Router.redirectURI + "&response_type=code" 
       return try (pathString, nil) 

      default: break 

      } 
     }() 


     let baseURL = try Router.baseURLString.asURL() 
     let urlRequest = try URLRequest(url: baseURL.appendingPathComponent(result.path)) 
     return try Alamofire.URLEncoding.default.encode(urlRequest, with: result.parameters) 




    } 

} 

}

+0

有谁知道解决这个问题? –

回答

2

尝试换你的函数调用一个do-catch块内,并与try对它进行标记。像这样的东西

do {  
    let request = try Instagram.Router.requestOauthCode.asURLRequest() 

    // Continue with normal flow here. 
} catch { 
    // Handle error here. 
} 
+0

在这之后,我有smthg像: self.webView.loadRequest(请求作为URLRequest) 它现在说...成员请求(_:方法:参数:编码:标题)的二义引用 –