首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XCode 7/ Swift 2的字典类型速记语法错误

XCode 7/ Swift 2的字典类型速记语法错误
EN

Stack Overflow用户
提问于 2015-07-04 19:40:54
回答 2查看 506关注 0票数 1

基于Alamofire readme中的代码片段,XCode 7/ Swift 2在这段代码中显示了一大堆错误。我对Swift或iOS开发一无所知,所以这里有任何建议都将不胜感激。

代码语言:javascript
复制
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
    }
}
EN

回答 2

Stack Overflow用户

发布于 2015-07-04 20:02:51

如果不下载Alamofire,很难重现您的问题,但请尝试以下方法:

代码语言:javascript
复制
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.encodeparameters参数是可选的)。这是不必要的(非可选参数会自动升级为可选参数),而且将数组和字典等内容声明为可选通常是一种糟糕的做法--空通常就足够了,而且可选性会使事情变得复杂。

也就是说,您的代码看起来应该在没有这些更改的情况下进行编译,但看看清除这些杂乱是否有助于发现实际的错误。

(还有一些风格上的东西,变量应该以小写开头,甚至是像“url”这样的首字母缩写,以避免它们与大写开头的类型混淆。此外,我不会使用强制展开,而是让它保持可选,使用可选链接,如果最后是nil,则使用fatalError,但这只是我个人的偏好)

票数 0
EN

Stack Overflow用户

发布于 2015-07-04 20:19:06

不允许就地指定元组(path, parameters)的类型。您必须在其他地方指定类型:

在闭包的开始部分:

代码语言:javascript
复制
let (path, parameters) = {() -> (String, [String:AnyObject]?) in
    switch self {
    case .HealthCheck():
        return ("/v2/healthcheck", ["devId": PTVRouter.devId])
    }
}()

或作为其名称后的元组类型:

代码语言:javascript
复制
let (path, parameters) : (String, [String:AnyObject]?) = {
    switch self {
    case .HealthCheck():
        return ("/v2/healthcheck", ["devId": PTVRouter.devId])
    }
}()

请注意,在我看来,它的语法真的非常丑陋,并且在很大程度上混淆了代码的实际工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31220196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档