在闭包内编写for循环时出现Swift编译器错误

时间:2014-06-24 01:30:39

标签: 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, 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)
        }))
    }
}

奇怪的是,第二次我在Xcode中编写for dict:NSDictionary! in array,它开始抛出“SourceKitService Terminated”错误消息。

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

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

对此问题的任何见解都会很棒

4 个答案:

答案 0 :(得分:0)

这是我在Xcode 6 beta中经常遇到的一个非常奇怪的问题。当然,您应该file a bug report来了解它。

至于绕过它,我发现让它运作的唯一方法就是这样做:

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,然后将它转换为我需要使用它时所知道的任何东西。我最好的猜测是,类型检查员吓坏了。

这是一个可怕的黑客攻击,但它比没有我们心爱的格式化和编码更好。完成。

答案 1 :(得分:0)

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)
}

我觉得这里的问题是array在快速枚举中可能是nil for dict:NSDictionary!in array ),并且案例应该是在此之前处理。

如果您知道它不会是nil,那么您可以将其重写为:

for dict: NSDictionary! in array! { ...

如果可能为零,则我会使用'可选绑定'并将枚举包装在测试中:

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

答案 2 :(得分:0)

问题是NSArray映射到Array,所以行:

for dict:NSDictionary! in array {

无法正确映射。将转换移动到数组,你应该没问题:

for dict in array as Array<NSDictionary> {

只要所有array(ever)包含的是NSDictionary,这都会有效。如果它有可能没有,那么你必须使用类似于@undo建议的解决方案:

for item in array {
    if let dict = item as? NSDictionary {

请注意,在任何情况下都不需要解包dict,因为你知道NSArray永远不能包含nil。

答案 3 :(得分:0)

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

最终为我工作的解决方法是这样的:

for dict:AnyObject in response as NSArrary {

我试过的任何其他变体都没有用。我不知道为什么这可以解决任何其他解决方案,但它确实如此,所以唉......