Swift NSSet 和 CoreData

2024-04-27

我正在尝试将目标 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(使用前将#替换为@)

Swift NSSet 和 CoreData 的相关文章

随机推荐

  • 如何在 servicestack.net 中实现身份验证

    我正在调查 servicestack net 但它的示例和文章似乎没有涵盖身份验证 这是由 servicestack net 处理的东西 如果是的话如何处理 我特别有兴趣实现对以下方面的支持 OAuth 因此能够检查原始请求并验证它 检索关
  • 构建方法调用

    尝试遵循本指南 https github com Readify Neo4jClient wiki cypher examples get all users by label https github com Readify Neo4jC
  • PouchDB 身份验证:创建新的 CouchDB 用户

    我使用 PouchDB 身份验证插件 我喜欢它 然而 我对注册过程有点困惑 也许我没有以正确的方式使用它 我用它在我的 CouchDB 数据库中创建新用户 但我不明白为什么它与特定数据库关联 由于我在 CouchDB 用户的特定数据库之前创
  • 未初始化的枚举变量值

    我使用 enum 声明新类型 DAY 然后从中声明两个变量 day1 和 day2 然后当我使用未初始化的值时 我应该看到 0 到 6 之间的值 因为 enumlist 中的值介于 0 到 6 之间 但我收到了这些值改为 858993460
  • 我们如何找到 C# 整数数组中的项目计数?

    我需要在 C 数组中查找类型为整数的项目计数 我的意思是 int intArray new int 10 int 0 34 int 1 65 int 2 98 intArray 的项目计数为 3 我在下面找到了 strArray 的代码 但
  • C#:模拟内存泄漏

    我想用c 编写以下代码 a 模拟内存泄漏的小型控制台应用程序 b 小型控制台应用程序 它将调用上述应用程序并立即释放它 模拟管理内存泄漏问题 换句话说 应用程序 b 将不断调用并释放应用程序 a 以模拟如何遏制 叛逆 内存泄漏应用程序 而不
  • 更新jqGrid中的数据

    我在这种情况下使用 jqGrid 网格从第一个 URL 获取 JSON 数据 如果 URL 返回正确的 JSON 网格会显示该数据 如果 URL 返回不正确的数据 则会触发 grid 的 loadError 事件 在这种情况下 我想将网格的
  • Android JSoup 示例

    我只是想知道是否有人有一个包含 JSoup 的工作实现的示例 Eclipse 项目 我试图用它从网站上获取信息 并在谷歌上到处搜索试图让它工作 但不能 如果有人可以提供帮助 我将非常感激 JSoup 真的很容易使用 看看 JSoup 食谱中
  • 将比其父级更宽的 div 居中,而不设置负左边距

    我有一个div里面有一个div 里面的 div 比它的父级宽 所以正常的过程 margin left auto margin right auto 生成一个内部 div 其中子级的左边缘与父级的左边缘对齐 当人们回答这个问题时 他们通常会采
  • Android 上的 iptables 1.4.11

    我已经从以下位置下载了 Android 内核源代码http source android com source building kernels html http source android com source building ke
  • 将 jbyteArray 转换为字符数组,然后打印到控制台

    我正在编写一个 JNI 程序 其中我的 cpp 文件获取 jbyteArray 并且我希望能够使用 printf 打印 jbyteArray 为此 我相信我必须将 jbyteArray 转换为字符数组 对于背景知识 我的 JNI 的 jav
  • 使最后一个动态添加的手风琴打开

    我正在尝试添加引导程序手风琴 https v4 alpha getbootstrap com components collapse accordion example以编程方式 以便每次单击 添加 按钮时 都会生成一个新的手风琴 并关闭前
  • 将文本文件与 C# 中的文本模式进行比较?

    我将文本文件与类似的模式进行了比较 它正在将整行写入日志 如下所示 insert into depdb fin quick code met 但我需要单独写这个depdb或者depdb fin quick code met 即 我只需要这个
  • 在下载的同时从 UnityWebRequest 获取数据?

    我有这段代码可以进行 REST 调用 public IEnumerator GetCooroutine string route string finalURL URL route UnityWebRequest www UnityWebR
  • 树视图上的 VirtualizingStackPanel 不是虚拟化

    我在这里遇到一个问题 我想在 TreeView 中显示一些项目 大约 100 000 个元素 如果我使用默认的 WPF TreeView 一切似乎都可以工作 但如果我使用自定义 TreeView 目前只有 ItemsControl 虚拟化似
  • 何时在 VBA 中使用 TextFrame 或 TextFrame2

    例如 在 Powerpoint 中 文本框对象 http msdn microsoft com en us library office bb265592 28v office 12 29 aspx 表示 Shape 对象中的文本框架 包含
  • NAudio 音调变换

    我正在使用 NAudio DLL 并且正在寻找音调变换声音的示例代码 有一个使用的例子NAudio https github com naudio NAudio用于开源中的音高变换Skype 变声器 https github com mar
  • 如何远程获取系统的网络共享和连接?

    我正在寻找一种远程获取类似于以下控制台应用程序的信息的方法 net use 净份额 网络统计 ano 但是 我需要能够在系统上运行第三方应用程序的情况下执行此操作 这有效地排除了使用 psexec 远程执行命令 因为 psexec 将作为服
  • .NET:十进制到舍入字符串

    如果我有一个decimal 如何获得带有两位小数的字符串版本 这不起作用 Math Round myDecimal 2 ToString 0 00 不要使用大括号 它们用于使用以下命令将格式化值嵌入到较长的字符串中string Format
  • Swift NSSet 和 CoreData

    我正在尝试将目标 C 和 CoreData 应用程序移动到 Swift 和 iOS 但在迭代 NSSet 对象时遇到了困难 Xcode 已生成这些类 class Response NSManagedObject NSManaged var