将通用数组转换为NSOrderedSet?

时间:2016-12-01 19:44:28

标签: ios generics core-data nsorderedset

我需要指定fetch的返回值:

try! c.fetch(fr)

到多对多关系(itemsWithoutRatingOfLoggedInUser):

Utility.app(c: c).itemsWithoutRatingOfLoggedInUser = try! c.fetch(fr2)

得到以下错误。我能做什么?我尝试使用as!运算符进行投射,没有帮助。

enter image description here

1 个答案:

答案 0 :(得分:4)

转换(使用as)适用于某种类型的值可以解释作为其他明确相关类型的值的情况。此解释是根据语言特性定义的:类型关系(如继承或协议一致性),或少数特殊情况,其中Swift可以将基础或CF类型与Swift标准库等效的桥接器或CF类型桥接。

当你施放时,你要求Swift编译器/运行时稍微眯起眼睛并假装一种类型是另一种类型。 (甚至可能在幕后做一些小事,以便假装工作。)大多数情况下,当你有一个值比Swift知道更多关于它的类型时(在你的函数的上下文中),会发生投射。 #39;重写)。

当你的类型通过语言功能没有明确相关时 - 也就是说,一个不是另一个的子类,或者是另一个不采用的一个或者不是#&#ta; ta是#&# 39;来自Foundation / CF的一组特殊类型的等效类型,Swift知道如何桥接 - 你必须转换,而不是强制转换。 (当类型在语义上足够不同以至于你需要考虑转换的后果时,Swift也会让你转换而不是转换,比如在有符号和无符号整数之间进行转换。)

ArrayNSOrderedSet在语义上是不同的类型,您必须转换,而不是转换。

类型之间的转换要求将转换为的类型知道转换的类型,因此要执行转换,请使用initializer目标类型。

let stuff = managedObjectContext.fetch(request)
let orderedSet = NSOrderedSet(array: stuff)

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

let item = orderedSet as! MyObject