首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift NSSet & CoreData

Swift NSSet & CoreData
EN

Stack Overflow用户
提问于 2014-11-23 16:32:48
回答 2查看 8.6K关注 0票数 6

我正试图将一个目标C& CoreData应用程序移到Swift和iOS上,并通过迭代NSSet对象来敲击砖墙:

Xcode生成了以下类:

代码语言:javascript
复制
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迭代的方法。

代码语言:javascript
复制
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方法看起来像这样,工作得很好:

代码语言:javascript
复制
// 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);
}

这是斯威夫特的第三天,所以我可能错过了一些很明显的事情.但现在我真的不明白!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-23 16:37:41

代码语言:javascript
复制
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代码中这样做的:

代码语言:javascript
复制
for(Response *aresponse in self.response.question.responses)

但你忘了在斯威夫特做同样的事。您可以通过各种方式来完成这一任务;例如,您可以编写这样的东西:

代码语言:javascript
复制
for aresponse in self.response.question.responses {
    var scoreVal = (aresponse as Response).score.integerValue

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

一旦你习惯了这一点,你就会亲吻斯威夫特走在上面的地面。一直以来,在object中,您都在假设您拥有什么样的对象,但实际上您拥有的是一个id,编译器允许您向其发送任何信息--因此,您经常会遇到“未识别的选择器”。在Swift中,“未识别的选择器”崩溃基本上是不可能的,因为所有的类型都是指定的,编译器一开始就不会让您向对象发送不合适的消息。

票数 13
EN

Stack Overflow用户

发布于 2016-01-29 21:07:26

实际上我发现了一些可能有用的东西。在Xcode 7.2和SWIFT2.0版本中,以下声明工作:

代码语言:javascript
复制
@NSManaged var responses: Set<Response>

我认为这可能与Swift自动连接NSSet和NSArray的事实有关。我还没有找到这份文件,但它对我有用,如果有人能确认的话,我会很感激的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27091338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档