我正在尝试迁移我没有写入Swift 3的Swift 2.2 iOS应用程序。有许多函数使用Realm来获取模型并将它们返回到数组中。这些都在Swift 2.x中工作,但是在Swift 3中产生了以下错误。我还包含了相关的函数定义。
/SubmissionDataManager.swift:184:16:无法转换返回 表达式 '&LazyFilterBidirectionalCollection GT;'返回类型 ' [EntryModel]'
break
我不确定实际问题是什么,或者我将如何修复它。任何建议表示赞赏。
答案 0 :(得分:1)
为了提高效率,Swift推迟了数组的创建。它不是为您提供数组,而是为您提供LazyFilterBidirectionalCollection
,它是一个惰性Collection
包装器,包含满足谓词的基础集合的元素。在您的情况下,Realm元素满足您传递给filter
的闭包。 Lazy 表示在您访问它们时从Realm中提取值,而不是一次性全部。 Collection
是符合Sequence
和Indexable
的协议。 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]