我正试图将一个目标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方法看起来像这样,工作得很好:
// 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);
}这是斯威夫特的第三天,所以我可能错过了一些很明显的事情.但现在我真的不明白!
发布于 2014-11-23 16:37:41
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中有什么,所以它将每个值aresponse当作没有属性的AnyObject。因此,当您尝试获取score属性aresponse时,编译器会发出抱怨。
另一方面,您知道每个值aresponse都是响应。所以你需要告诉斯威夫特,通过转换(用as)。请注意,您实际上是在目标-C代码中这样做的:
for(Response *aresponse in self.response.question.responses)但你忘了在斯威夫特做同样的事。您可以通过各种方式来完成这一任务;例如,您可以编写这样的东西:
for aresponse in self.response.question.responses {
var scoreVal = (aresponse as Response).score.integerValue这让我们通过了编译器,编译器现在分享了我们对这个变量到底是什么的知识。
一旦你习惯了这一点,你就会亲吻斯威夫特走在上面的地面。一直以来,在object中,您都在假设您拥有什么样的对象,但实际上您拥有的是一个id,编译器允许您向其发送任何信息--因此,您经常会遇到“未识别的选择器”。在Swift中,“未识别的选择器”崩溃基本上是不可能的,因为所有的类型都是指定的,编译器一开始就不会让您向对象发送不合适的消息。
发布于 2016-01-29 21:07:26
实际上我发现了一些可能有用的东西。在Xcode 7.2和SWIFT2.0版本中,以下声明工作:
@NSManaged var responses: Set<Response>我认为这可能与Swift自动连接NSSet和NSArray的事实有关。我还没有找到这份文件,但它对我有用,如果有人能确认的话,我会很感激的。
https://stackoverflow.com/questions/27091338
复制相似问题