我正在尝试将我未编写的 Swift 2.2 iOS 应用程序迁移到 Swift 3。有许多函数使用 Realm 来获取模型并将它们返回到数组中。这些都在 Swift 2.x 中有效,但在 Swift 3 中生成了以下错误。我还包含了相关的函数定义。
/SubmissionDataManager.swift:184:16: Cannot convert return expression of type 'LazyFilterBidirectionalCollection>' to return type '[EntryModel]'
func validateSubmission(_ submissionId: Int) -> ([EntryModel]) {
let realm = try! Realm()
let submissionModel = realm.objects(SubmissionModel.self).filter({ $0.id == submissionId }).first!
let entryModels = submissionModel.entryModels
// Check for all entry details field which are mandatory and are empty and not hidden
let emptyEntryModels = entryModels.filter({ $0.entryDetailArray.filter({ $0.entryDetailValue.isEmpty && $0.isMandatory && !($0.isHidden) }).count > 0 })
return emptyEntryModels
}
我不确定实际问题是什么,或者我将如何解决它。任何建议表示赞赏。
最佳答案
为了提高效率,Swift 推迟了数组的创建。它不是为您提供数组,而是为您提供 LazyFilterBidirectionalCollection
,这是一个惰性 Collection
包装器,其中包含满足谓词的基础集合的元素。在您的情况下,是满足您传递给 filter
的闭包的 Realm 元素。 Lazy 意味着当您访问它们时,值是从 Realm 中提取的,而不是一次全部提取。 Collection
是一个符合Sequence
和Indexable
的协议(protocol)。 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]
关于ios - 无法转换类型为 'LazyFilterBidirectionalCollection>' 的返回表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42321459/