- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
当然,有序集合是集合的更具体的情况,那么为什么 NSOrderedSet
继承自 NSObject
而不是 NSSet
?
最佳答案
我通过了 NSSet
的接口(interface),你是对的,有序集合似乎满足 Liskov substitution principle因此可以从 NSSet
继承。
有一个小方法可以解决这个问题:mutableCopy
。 mutableCopy
的返回值必须是 NSMutableSet
,但 NSMutableOrderedSet
应该继承自 NSOrderedSet
。你不能两者兼得。
让我用一些代码来解释一下。首先,我们看一下NSSet
和NSMutableSet
的正确行为:
NSSet* immutable = [NSSet set];
NSMutableSet* mutable = [immutable mutableCopy];
[mutable isKindOfClass:[NSSet class]]; // YES
[mutable isKindOfClass:[NSMutableSet class]]; // YES
现在,让我们假设 NSOrderedSet
继承自 NSSet
,而 NSMutableOrderedSet
继承自 NSOrderedSet
:
//Example 1
NSOrderedSet* immutable = [NSOrderedSet orderedSet];
NSMutableOrderedSet* mutable = [immutable mutableCopy];
[mutable isKindOfClass:[NSSet class]]; // YES
[mutable isKindOfClass:[NSMutableSet class]]; // NO (this is the problem)
如果 NSMutableOrderedSet
继承自 NSMutableSet
会怎样?然后我们得到一个不同的问题:
//Example 2
NSOrderedSet* immutable = [NSOrderedSet orderedSet];
NSMutableOrderedSet* mutable = [immutable mutableCopy];
[mutable isKindOfClass:[NSSet class]]; // YES
[mutable isKindOfClass:[NSMutableSet class]]; // YES
[mutable isKindOfClass:[NSOrderedSet class]]; // NO (this is a problem)
在示例 1 中,您无法将 NSOrderedSet
传递给需要 NSSet
的函数,因为行为不同。基本上,这是一个向后兼容性问题。
在示例 2 中,您不能将 NSMutableOrderedSet
传递给需要 NSOrderedSet
的函数,因为前者不会从后者继承。
所有这一切都是因为 NSMutableOrderedSet
不能同时继承自 NSMutableSet
和 NSOrderedSet
因为 Objective-C 没有多重继承。解决这个问题的方法是为 NSMutableSet
和 NSOrderedSet
制定协议(protocol),因为这样 NSMutableOrderedSet
可以实现这两种协议(protocol)。我猜 Apple 开发人员只是在没有额外协议(protocol)的情况下更简单。
关于objective-c - 为什么 NSOrderedSet 不继承自 NSSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11278995/
在我的 Lion 应用程序上,我有以下数据模型: Item 内的 subitems 关系是有序的。 Xcode 4.1(内部版本 4B110)已为我创建了文件 Item.h、Item.m、SubIte
我的核心数据模型: Playlist ======= name songs (to-many relationship to Song objects, NSOrderedSet) 一个播放列表有多首
我有一个 NSManagedObject 子类(Parent),它与另一个 NSManagedObject 子类(Child)具有有序的一对多关系。我要求 Parent 使用 KVO 来观察其 NSO
我需要分配一个fetch的返回值: try! c.fetch(fr) 对多关系(itemsWithoutRatingOfLoggedInUser): Utility.app(c: c).itemsWi
我需要将 NSOrderedSet 保存为内部 NSDictionary 对象的容器。我试着把set保存到plist,但是这个类不能保存在这里。有没有其他方法可以轻松保存,不去Core Data丛林?
标题是怎么说的 - 我想确定对象在最后一个位置,但我找不到 NSOrderedSet 的任何函数。是否可以简单地设置为 data[data.count]? 最佳答案 NSOrderedSet是不可变的
我正在尝试迭代 NSOrderedSet 的一个实例。像这样: func myFunc() { var orderedSet = NSOrderedSet(array: [ 42, 43, 4
我对此做了一些研究 post .但它的解决方案都不适合我。让我解释一下我做了什么: 它实际上与提到的帖子非常相似。 类别.h @class Category, Item; @interface Cat
NSOrderedSet 似乎能够提供 O(1) 的哈希表查找速度和类似于对象排序的数组?用于实现此目的的数据结构是什么?它是两者的组合,例如:哈希表和一个单独的数组,其中索引 i 具有与其在哈希表中
今天我在执行第一个CoreData步骤时遇到了一些麻烦,发现了这个线程: Exception thrown in NSOrderedSet generated accessors 我可以通过cocoa
我正在为一个项目使用 Core Data,在删除与 Book 对象有关系的 Page 对象时遇到了一些问题(Book 对象存储了一个存储 Page 对象的 NSOrderedSet)。我尝试通过这样做
我正在使用 NSOrderedSet 将数据存储在 Json 服务器中并以这种方式执行,因为数据到达时是重复的,我必须过滤它们以仅保留一个值。现在我需要在 NSOrderedSet 的开头添加一个值。
将新的核心数据实体 (EntityB) 插入另一个实体 (EntityA) 的 NSOrderedSet 关系属性时,我遇到了一个奇怪的行为; index 被忽略,对象总是插入到有序集的末尾。 插入的
由于某些奇怪的原因,NSOrderedSet 似乎没有在 iOS 中实现。是否有另一个对象提供类似的功能——基本上是随机插入/删除对象并按排序顺序访问第一个/最后一个的能力? 在我看来,为了实现基本的
在 Swift 2 中我可以这样做: let foo = NSOrderedSet() foo.enumerateObjects { obj, idx, _ in ... }
我在重构一些代码时遇到了一个问题。我已经为我的项目实现了 MOGenerator。然而,我的一些关系是有序的,默认情况下,这将导致为 CRUD 操作创建 8 种不同的附属方法。但是 MOGenerat
我想显示来自后端的数据所以让我们看一个示例 json 文件: { "fonts": [ { "name": "Helvetica", "styleIdentifie
我有一个股票价格列表,其属性为 dateTime 和 value。 目前,我在使用排序描述符获取股价时对股价进行排序。 现在,我想更改我的代码并将它们存储在已经排序的顺序中,以便更快地检索最新的股价
有谁知道为什么我不能在 Core Data 的 NSOrderedSet 关系中保存对象顺序的更改?我已经知道使用 NSOrderedSet 关系生成的函数效果不佳的错误,因此我总是使用键路径。下面是
我一直在网上到处搜索,并尝试了迄今为止我能想到的一切,但都无济于事。这是我的问题:在我的程序中,我有一个名为 Scale 的类,Scale 有几个属性。用户可以通过单击名为 addScale 的按钮向
我是一名优秀的程序员,十分优秀!