Swift NSSet&CoreData

我试图将一个客观的C&CoreData应用程序移动到Swift和iOS,并通过遍历NSSet对象来打砖墙:

Xcode已经生成了这些类:

class Response: NSManagedObject { @NSManaged var responseText: String @NSManaged var score: NSNumber @NSManaged var answers: NSSet @NSManaged var question: Question } class Question: NSManagedObject { @NSManaged var questionText: String @NSManaged var questionType: String @NSManaged var qualifier: Qualifier @NSManaged var responses: NSSet } 

然后在第三类我添加一个方法,需要迭代通过NSSet ..

 class Answer: NSManagedObject { @NSManaged var evaluation: Evaluation @NSManaged var response: Response func scoreGap() -> Int { var max = 0 for aresponse in self.response.question.responses { // this next line throws an error var scoreVal = aresponse.score.integerValue if scoreVal > max { max = scoreVal } } return max - self.response.score.integerValue } } 

上面的注释之后的行给出了错误“AnyObject没有名为score的成员”

Objective-C方法看起来像这样,工作正常:

 // returns the gap between the score of this answer and the max score -(NSNumber *)scoreGap { long max = 0; for(Response *aresponse in self.response.question.responses) { if(aresponse.score.longValue > max) max = aresponse.score.longValue; } max = max - self.response.score.longValue; return @(max); } 

这是关于Swift的第三天,所以我可能会错过一些非常明显的东西……但是目前我真的不明白这一点!

 for aresponse in self.response.question.responses { // this next line throws an error var scoreVal = aresponse.score.integerValue 

问题在于, for aresponse in ... responses是通过NSSet迭代的。 Swift不知道 NSSet中是什么,所以它把每个值作为一个AnyObject,它没有任何属性。 因此,当您尝试获取aresponsescore属性时,编译器会抱怨。

另一方面,你知道每个值都是响应。 所以你需要通过铸造(和as )来告诉 Swift。 请注意,您实际上是在您的Objective-C代码中执行此操作:

 for(Response *aresponse in self.response.question.responses) 

但是你忘记了在Swift中做同样的事情。 你可以用不同的方法做到这一点。 例如你可以写这样的事情:

 for aresponse in self.response.question.responses { var scoreVal = (aresponse as Response).score.integerValue 

这让我们通过了编译器,它现在分享我们对这个variables是什么的知识。

一旦你习惯了这个,你将亲吻Swift走的路。 所有这一次,在Objective-C中,你都在假设你有什么样的对象,但实际上你所拥有的是一个id ,编译器让你发送任何消息给它 – 所以,你经常与“无法识别的select器”崩溃。 在Swift中,“无法识别的select器”崩溃基本上是不可能的,因为指定了所有的types,编译器不会让你发送不适当的消息给对象。

其实我发现了一些可能有用的东西。 从版本Xcode 7.2和Swift 2.0开始,以下声明可以工作:

 @NSManaged var responses: Set<Response> 

我认为这可能与Swift在NSSet和NSArray之间自动桥接有关。 我还没有find这个logging,但它是为我工作,如果有人确认,我将不胜感激。