无法转换类型' LazyFilterBidirectionalCollection>'的返回表达式

时间:2017-02-18 22:34:33

标签: ios arrays swift model realm

我正在尝试迁移我没有写入Swift 3的Swift 2.2 iOS应用程序。有许多函数使用Realm来获取模型并将它们返回到数组中。这些都在Swift 2.x中工作,但是在Swift 3中产生了以下错误。我还包含了相关的函数定义。

  

/SubmissionDataManager.swift:184:16:无法转换返回   表达式   '&LazyFilterBidirectionalCollection GT;'返回类型   ' [EntryModel]'

break

我不确定实际问题是什么,或者我将如何修复它。任何建议表示赞赏。

1 个答案:

答案 0 :(得分:1)

为了提高效率,Swift推迟了数组的创建。它不是为您提供数组,而是为您提供LazyFilterBidirectionalCollection,它是一个惰性Collection包装器,包含满足谓词的基础集合的元素。在您的情况下,Realm元素满足您传递给filter的闭包。 Lazy 表示在您访问它们时从Realm中提取值,而不是一次性全部。 Collection是符合SequenceIndexable的协议。 Sequence是一种提供对其元素的顺序迭代访问的类型。因此,在最基本的层面上,LazyFilterBidirectionalCollection是一个序列。

Array有一个初始值设定项可将Sequence转换为数组:

init<S : Sequence where S.Iterator.Element == Element>(_ s: S)

因为你需要返回一个真正的数组

取代:

return emptyEntryModels

使用:

return Array(emptyEntryModels)

这将从LazyFilterBidirectionalCollection生成一个正确的数组。

使用此Array初始值设定项将序列转换为数组的其他示例:

let digits = Array(0...9)                             // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
let odds = Array(stride(from: 1, through: 9, by: 2))  // [1, 3, 5, 7, 9]