将通用数组转换为NSOrderedSet吗?

Ján*_*nos 0 generics core-data ios nsorderedset

我需要分配一个返回值fetch

try! c.fetch(fr)
Run Code Online (Sandbox Code Playgroud)

与多对多关系(itemsWithoutRatingOfLoggedInUser):

Utility.app(c: c).itemsWithoutRatingOfLoggedInUser = try! c.fetch(fr2)
Run Code Online (Sandbox Code Playgroud)

并得到以下错误。我能做什么?我试图与as!运算符进行转换,没有帮助。

在此处输入图片说明

ric*_*ter 5

强制转换(带有as)用于一种类型的值可以解释为另一种显式相关类型的值的情况。这种解释是根据语言功能定义的:类型关系(例如继承或协议一致性),或少数特殊情况,其中Swift可以将Foundation或CF类型桥接到它们的Swift标准库等效项/从中转换出来。

投射时,您要让Swift编译器/运行时稍稍斜视一下,并假装一种类型是另一种。(也许甚至做幕后有点摆弄使假装作品。)大多数情况下,铸造,当你有一个地方发生的价值知道更多关于它的类型不是斯威夫特(在功能你写的上下文中)一样。

如果您的语言类型与语言功能没有明确关联,也就是说,一个语言不是另一个语言的子类,或者一个不是另一个语言的协议,或者它们不是一组特殊的语言, Swift知道如何桥接的来自Foundation / CF的等效类型-您必须转换而不是强制转换。(当类型在语义上有足够大的差异而您需要考虑转换的结果时,例如在有符号和无符号整数之间移动时,Swift还使您可以转换而不是强制转换。)

Array并且NSOrderedSet在语义上有足够不同的类型,您必须转换而不是转换。

类型之间的转换需要该类型被转换了解正在转换的类型,所以执行您使用的转换初始值设定所述目标类型的。

let stuff = managedObjectContext.fetch(request)
let orderedSet = NSOrderedSet(array: stuff)
Run Code Online (Sandbox Code Playgroud)

请注意,这NSOrderedSet不是Swift 3中的泛型类型,因此即使您从类型化数组([MyObject])创建它,元素也会显示为Any这是强制转换的用例:

let item = orderedSet as! MyObject
Run Code Online (Sandbox Code Playgroud)