
基于Alamofire readme中的代码片段,XCode 7/ Swift 2在这段代码中显示了一大堆错误。我对Swift或iOS开发一无所知,所以这里有任何建议都将不胜感激。
import Foundation
import Alamofire
enum PTVRouter: URLRequestConvertible {
static let baseUrl = "http://timetableapi.ptv.vic.gov.au/"
static let devId = "__CENSORED__"
static let devKey = "__CENSORED__"
case HealthCheck()
var URLRequest: NSURLRequest {
let (path: String, parameters: [String: AnyObject]?) = {
switch self {
case .HealthCheck():
return ("/v2/healthcheck", ["devId": PTVRouter.devId])
}
}()
let URL = NSURL(string: PTVRouter.baseUrl)!
let URLRequest = NSURLRequest(URL: URL.URLByAppendingPathComponent(path))
let encoding = Alamofire.ParameterEncoding.URL
return encoding.encode(URLRequest, parameters: parameters).0
}
}发布于 2015-07-04 20:02:51
如果不下载Alamofire,很难重现您的问题,但请尝试以下方法:
enum PTVRouter: URLRequestConvertible {
static let baseUrl = "http://timetableapi.ptv.vic.gov.au/"
static let devId = "__CENSORED__"
static let devKey = "__CENSORED__"
case HealthCheck
var URLRequest: NSURLRequest {
let path: String
let parameters: [String: AnyObject]
switch self {
case .HealthCheck:
path = "/v2/healthcheck"
parameters = ["devId": PTVRouter.devId]
}
let url = NSURL(string: PTVRouter.baseUrl)!
let urlRequest = NSURLRequest(URL: url.URLByAppendingPathComponent(path))
let encoding = Alamofire.ParameterEncoding.URL
return encoding.encode(urlRequest, parameters: parameters).0
return urlRequest
}
}注意事项:
从Swift 1.2开始,示例使用的技术不再是必需的,因为let变量的延迟初始化现在是可能的。(他们真的应该更新示例代码)。
您不需要在case HealthCheck之后放置()。()用于在案例中包含相关的类型(在本例中,它们包含查询的参数),在您的案例中,由于没有任何参数,因此不需要使用括号。
它们将parameters变量声明为可选(可能是因为encoding.encode的parameters参数是可选的)。这是不必要的(非可选参数会自动升级为可选参数),而且将数组和字典等内容声明为可选通常是一种糟糕的做法--空通常就足够了,而且可选性会使事情变得复杂。
也就是说,您的代码看起来应该在没有这些更改的情况下进行编译,但看看清除这些杂乱是否有助于发现实际的错误。
(还有一些风格上的东西,变量应该以小写开头,甚至是像“url”这样的首字母缩写,以避免它们与大写开头的类型混淆。此外,我不会使用强制展开,而是让它保持可选,使用可选链接,如果最后是nil,则使用fatalError,但这只是我个人的偏好)
发布于 2015-07-04 20:19:06
不允许就地指定元组(path, parameters)的类型。您必须在其他地方指定类型:
在闭包的开始部分:
let (path, parameters) = {() -> (String, [String:AnyObject]?) in
switch self {
case .HealthCheck():
return ("/v2/healthcheck", ["devId": PTVRouter.devId])
}
}()或作为其名称后的元组类型:
let (path, parameters) : (String, [String:AnyObject]?) = {
switch self {
case .HealthCheck():
return ("/v2/healthcheck", ["devId": PTVRouter.devId])
}
}()请注意,在我看来,它的语法真的非常丑陋,并且在很大程度上混淆了代码的实际工作。
https://stackoverflow.com/questions/31220196
复制相似问题