Ios Swift编译器在闭包中写入for循环时出错

Ios Swift编译器在闭包中写入for循环时出错,ios,swift,xcode6,Ios,Swift,Xcode6,我有一门课,GGAdvertiser class GGAdvertiser: GGObject { var id:NSInteger? var name:NSString? func getAdvertisers(success:AnyObject! -> Void, failure:NSError! -> Void) { GGNetworking.shared.request("advertisers", params: nil, meth

我有一门课,
GGAdvertiser

class GGAdvertiser: GGObject {
    var id:NSInteger?
    var name:NSString?

    func getAdvertisers(success:AnyObject! -> Void, failure:NSError! -> Void) {
        GGNetworking.shared.request("advertisers", params: nil, methodType: GGHTTPType.get, success:({ response in
            var advertisers = NSMutableArray(capacity: response.count)
            let array:NSArray! = response as NSArray

            for dict:NSDictionary! in array {
                let advertiser = GGAdvertiser(dictionary:dict)
                assert(advertiser == nil, "Advertiser must serialize; can't be nil'")
                advertisers.addObject(advertiser)
            }
            success(advertisers)
            }), failure:({ error in
                GGNetworking.defaultError(error)
                failure(error)
        }))
    }
}
奇怪的是,就在我为dict:NSDictionary编写
的那一秒!在Xcode的数组中,它开始抛出“SourceKitService Terminated”错误消息

我已经尝试了各种可能的方法将for循环实现到函数中,但每次都得到相同的结果。这个问题几乎无法诊断,因为该错误会关闭编译器的错误报告。换句话说,我没有得到一个关于问题是什么的信息

我通常只会继续运行,因为它不会导致错误,但它会每隔5秒左右闪烁相同的错误消息(好像要重试运行SourceKit)。另外,我没有代码格式或自动完成。都很烦人


任何对这个问题的洞察都是非常好的

这是我在Xcode 6 beta版中经常遇到的一个非常奇怪的问题。你当然应该考虑一下

至于绕开它,我发现让它发挥作用的唯一方法是:

for dict:AnyObject! in array { //Play with whether to have a ! or not. I can't remember which works.
    let advertiser = GGAdvertiser(dictionary:(dict as NSDictionary!))
    assert(advertiser == nil, "Advertiser must serialize; can't be nil'")
    advertisers.addObject(advertiser)
}
出于某种原因,当forin循环中的对象被称为除AnyObject之外的任何对象时,它会发疯。所以我只是说它是一个AnyObject,然后在我需要使用它的时候,将它转换成我知道的任何东西。我最好的猜测是打字机检查员疯了

这是一个可怕的黑客行为,但总比在没有我们钟爱的格式化和完成的情况下尝试编码要好

let array:NSArray! = response as NSArray

for dict:NSDictionary! in array {
    let advertiser = GGAdvertiser(dictionary:dict)
    assert(advertiser == nil, "Advertiser must serialize; can't be nil'")
    advertisers.addObject(advertiser)
}
我觉得这里的问题是,在快速枚举(对于dict:NSDictionary!in array)中,
array
可能是
nil
,并且应该在这之前处理这个案例

如果您知道它不会为零,您可以将其改写为:

for dict: NSDictionary! in array! { ...
如果有可能是nil,那么我将使用“可选绑定”并在测试中包装枚举:

if let responseArray = array {
    for dict: NSDictionary! in responseArray {
    ...

问题是NSArray映射到数组,因此该行:

for dict:NSDictionary! in array {
无法正确映射。将转换移动到阵列,您应该可以:

for dict in array as Array<NSDictionary> {

请注意,在这两种情况下都不需要打开dict,因为您知道NSArray中永远不会包含nil。

所以我提交了一份错误报告。当我弄清楚如何分享这个答案时,我会用链接更新它

最终对我有效的解决方法如下:

for dict:AnyObject in response as NSArrary {

实际上,我尝试的任何其他变体都不起作用。我不知道为什么这比其他任何解决方案都有效,但它确实有效,所以,唉…

你是对的,但我尝试了这个实现,它给了我同样的错误。我相信你通常会有一个观点,但这是一个编译器错误:/真的吗?它对我有用。。。也许在做更改之前注释掉这行:)然后在正确的格式中取消注释我在问问题之前尝试过这一点,刚才我又尝试了一次,但没有成功。但是我知道你是对的(或者至少,我同意你的看法)。这是不正确的,因为对象
数组
是非泛型类型(
NSArray
),因此它会抛出实际的编译器错误。在这种情况下,这似乎是一个编译器错误不幸的是,这仍然会导致相同的编译器错误。。。无论我尝试什么变化。
for dict:AnyObject in response as NSArrary {