移动到 cocoapod 时,Swift Routing 枚举崩溃

Posted

技术标签:

【中文标题】移动到 cocoapod 时,Swift Routing 枚举崩溃【英文标题】:Swift Routing enum crashes when moved to a cocoapod 【发布时间】:2016-04-28 00:31:07 【问题描述】:

我最近一直在将代码重构为一个基本的 cocoapod,以便在多个项目中使用。一个这样的类是 Alamofire 的一个非常典型的路由枚举。它一直运行良好,直到被移入 cocoapod ......现在它正在崩溃。一个示例实现:

public enum Router: URLRequestConvertible 

    static var baseURLString = "http://myserver.com/api"

    case Endpoint1(String, String)
    case Endpoint2(String, String, Date, Date)
    case Endpoint3(String, String)

    public var URLRequest: NSMutableURLRequest 
        var path : String! 
            switch self 
            case .Endpoint1(let id, _):
                return "/endpoint1/" + id
            case .Endpoint2(let id, _, _, _):
                return "/booking/\(id)/thing"
            case .Endpoint3(_, _):
                return "/authenticate"
            
        

        var parameters: [String: AnyObject] 
            switch self 
            case .Endpoint2(_, _, let startDate, let endDate):
                let params = ["startDate": startDate, "endDate" : endDate]
                return params
            default:
                let params = [String: AnyObject]()
                return params
            
        

        var method :  Alamofire.Method 
            switch self 
            case .Endpoint2:
                return .POST
            default:
                return .GET
            
        

        var body : [String : AnyObject]?
            switch self
            case .Endpoint3(let email, let password):
                return ["email" : "\(email)", "password" : "\(password)"]
            default:
                return nil
            
        

        var header : [String: String]?
            switch self 
            case .Endpoint1(_, let token):
                return ["x-access-token" : token]
            default:
                return nil
            
        

        let URL = NSURL(string: Router.baseURLString)?.URLByAppendingPathComponent(path)
        let request = NSURLRequest(URL: URL!)

        let encoding = Alamofire.ParameterEncoding.URL

        let mutable = (encoding.encode(request, parameters: parameters).0)
        mutable.HTTPMethod = method.rawValue

        if let bodyParams = body
            mutable.setValue("application/json", forHTTPHeaderField: "Content-Type")
            mutable.addJsonArrayToRequestBody(bodyParams)
        

        if let headerParams = header
            for param in headerParams
                mutable.setValue(param.1, forHTTPHeaderField: param.0)
            
        

        return mutable
    

故障线是:

for param in headerParams

但由于它是在开发 cocoapod 中,我无法将调试器附加到该点,错误也不超过 EXEC_BAD_INSTRUCTION,这没什么帮助。如何进一步调试导致错误的原因?

【问题讨论】:

在解包之前放置断点时,标头变量是否包含预期值? 【参考方案1】:

这是使用开发 cocoapod 时 xcode 调试器中的一个错误,实际错误是:

让 URL = NSURL(string: Router.baseURLString)?.URLByAppendingPathComponent(path)

调用此方法时尚未设置静态 baseURLString,导致 URL 为 nil。在现在共享的代码中,我看到调试器多次指出错误的行,不知道如何修复。

【讨论】:

以上是关于移动到 cocoapod 时,Swift Routing 枚举崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Swift 框架的 CocoaPod 和单元测试

Cocoapods、Swift 和 FMDB Cipher - 这三个目前兼容吗?

将使用 Cocoapods 1.0.1 的 iOS 应用程序从 Swift 2.2 迁移到 3.0

具有Swift 4依赖项的Swift 3 Cocoapod

在 Swift 中使用 CocoaPods 时忽略编译警告

Obj-C 到 Swift 的转换(包括 Cocoapods)