我需要分配 a 的返回值fetch
:
try! c.fetch(fr)
对多关系 ( itemsWithoutRatingOfLoggedInUser
):
Utility.app(c: c).itemsWithoutRatingOfLoggedInUser = try! c.fetch(fr2)
并得到以下错误。我能做些什么?我尝试使用as!
操作员进行投射,但没有帮助。
我需要分配 a 的返回值fetch
:
try! c.fetch(fr)
对多关系 ( itemsWithoutRatingOfLoggedInUser
):
Utility.app(c: c).itemsWithoutRatingOfLoggedInUser = try! c.fetch(fr2)
并得到以下错误。我能做些什么?我尝试使用as!
操作员进行投射,但没有帮助。
强制转换 (with as
) 适用于一种类型的值可以解释为其他一些显式相关类型的值的情况。这种解释是根据语言特性定义的:类型关系(如继承或协议一致性),或者 Swift 可以将 Foundation 或 CF 类型与它们的 Swift 标准库等价物桥接的少数特殊情况。
当您进行转换时,您是在要求 Swift 编译器/运行时稍微眯起眼睛,假装一种类型是另一种类型。(甚至可能在幕后花点功夫,这样假装才有效。)大多数情况下,当你有一个值比 Swift(在你正在编写的函数的上下文中)更了解它的类型时,就会发生强制转换。
当你的类型通过语言特性没有明确相关时——也就是说,一个不是另一个的子类,或者一个不是另一个采用的协议,或者它们不是特殊的集合之一Swift 知道如何桥接的 Foundation/CF 中的等效类型——你必须转换,而不是强制转换。(当类型在语义上的差异足以让您需要考虑转换的后果时,Swift 还会让您转换而不是强制转换,例如在有符号和无符号整数之间转换时。)
Array
并且NSOrderedSet
在语义上是足够不同的类型,您必须转换,而不是强制转换。
类型之间的转换要求被转换的类型知道被转换的类型,因此要执行转换,您使用目标类型的初始值设定项。
let stuff = managedObjectContext.fetch(request)
let orderedSet = NSOrderedSet(array: stuff)
请注意,这NSOrderedSet
不是 Swift 3 中的泛型类型,因此即使您从类型化数组 ( [MyObject]
) 创建它,元素也会以Any
. 这是铸造的一个用例:
let item = orderedSet as! MyObject