我需要指定fetch
的返回值:
try! c.fetch(fr)
到多对多关系(itemsWithoutRatingOfLoggedInUser
):
Utility.app(c: c).itemsWithoutRatingOfLoggedInUser = try! c.fetch(fr2)
得到以下错误。我能做什么?我尝试使用as!
运算符进行投射,没有帮助。
答案 0 :(得分:4)
转换(使用as
)适用于某种类型的值可以解释作为其他明确相关类型的值的情况。此解释是根据语言特性定义的:类型关系(如继承或协议一致性),或少数特殊情况,其中Swift可以将基础或CF类型与Swift标准库等效的桥接器或CF类型桥接。
当你施放时,你要求Swift编译器/运行时稍微眯起眼睛并假装一种类型是另一种类型。 (甚至可能在幕后做一些小事,以便假装工作。)大多数情况下,当你有一个值你比Swift知道更多关于它的类型时(在你的函数的上下文中),会发生投射。 #39;重写)。
当你的类型通过语言功能没有明确相关时 - 也就是说,一个不是另一个的子类,或者是另一个不采用的一个或者不是#&#ta; ta是#&# 39;来自Foundation / CF的一组特殊类型的等效类型,Swift知道如何桥接 - 你必须转换,而不是强制转换。 (当类型在语义上足够不同以至于你需要考虑转换的后果时,Swift也会让你转换而不是转换,比如在有符号和无符号整数之间进行转换。)
Array
和NSOrderedSet
在语义上是不同的类型,您必须转换,而不是转换。
类型之间的转换要求将转换为的类型知道从转换的类型,因此要执行转换,请使用initializer目标类型。
let stuff = managedObjectContext.fetch(request)
let orderedSet = NSOrderedSet(array: stuff)
请注意,NSOrderedSet
不是Swift 3中的泛型类型,因此即使您从类型化数组([MyObject]
)创建它,元素也会显示为Any
。 那是用于投射的用例:
let item = orderedSet as! MyObject