我有一个班级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一样)。另外,我没有代码格式或自动完成。一切都很烦人......
对此问题的任何见解都会很棒
答案 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 {
我试过的任何其他变体都没有用。我不知道为什么这可以解决任何其他解决方案,但它确实如此,所以唉......