2016-09-07 80 views
0

这是在XCode 7.3上。Swift 2.2 - 代码崩溃,除非我关闭优化(-Onone)

如果我使用优化标记-O构建代码,它将会崩溃。它工作正常,没有优化(标志-Onone)。不过,我希望通过优化来构建我的代码。

它是Swift编译器的bug吗?

这是代码。

import Foundation 

extension Dictionary where Key: StringLiteralConvertible, Value: AnyObject { 
    func multipartFormParams(preFix preFix: String = "") -> [String: AnyObject] { 
    var params: [String: AnyObject] = [:] 
    for (key, value) in self { 
     let subKey = preFix != "" ? "\(preFix)[\(key)]" : String(key) 
     if let value = value as? [String: AnyObject] { 
     // params += value.multipartFormParams(preFix: subKey) // this is my original code, however remove the operation extension += to focus on the bug. 
     value.multipartFormParams(preFix: subKey) // It crash here. 
     } else { 
     params[subKey] = value 
     } 
    } 
    return params 
    } 
} 

let parameters: [String: AnyObject] = [ 
    "user": [ 
    "first_name": "first", 
    "last_name": "last" 
    ] 
] 

parameters.multipartFormParams() 
+0

它在哪里崩溃? –

+0

@MarcoSantarossa看到一行'value.multipartFormParams(preFix:subKey)#它在这里崩溃。 – dfri

+0

@MartinR:编译器不会崩溃,这是一个运行时错误。 – CIMinuv

回答

0

一段时间后,我发现,这是关系到这个错误:https://bugs.swift.org/browse/SR-1114,改变for (key, value) in self {forEach { key, value in解决了这个问题。

完整的工作版本:

import Foundation 

extension Dictionary where Key: StringLiteralConvertible, Value: AnyObject { 
    func multipartFormParams(preFix preFix: String = "") -> [String: AnyObject] { 
    var params: [String: AnyObject] = [:] 
    forEach { key, value in 
     let subKey = preFix != "" ? "\(preFix)[\(key)]" : String(key) 
     if let value = value as? [String: AnyObject] { 
     // params += value.multipartFormParams(preFix: subKey) // this is my original code, however remove the operation extension += to focus on the bug. 
     value.multipartFormParams(preFix: subKey) // It crash here. 
     } else { 
     params[subKey] = value 
     } 
    } 
    return params 
    } 
} 

let parameters: [String: AnyObject] = [ 
    "user": [ 
    "first_name": "first", 
    "last_name": "last" 
    ] 
] 

parameters.multipartFormParams()