我正在尝试将目标 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。斯威夫特不知道是什么inNSSet,所以它处理每个值aresponse
作为 AnyObject,它没有属性。因此,当您尝试获取时,编译器会抱怨score
的财产aresponse
.
You,另一方面,知道每个值aresponse
是一个响应。所以你需要tell通过强制转换(使用as
)。请注意,您实际上是在 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
这让我们绕过了编译器,编译器现在分享了我们关于这个变量到底是什么的知识。
一旦你习惯了这一点,你就会亲吻斯威夫特走过的土地。一直以来,在 Objective-C 中,你都在做假设关于你拥有什么样的物体,但事实上你拥有的是一个id
并且编译器允许您向它发送任何消息 - 因此,您经常会因“无法识别的选择器”而崩溃。在 Swift 中,“无法识别的选择器”崩溃基本上是不可能的,因为所有内容的类型都已指定,并且编译器首先不会让您向对象发送不适当的消息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)