【问题标题】:Cannot convert return expression of type 'LazyFilterBidirectionalCollection>'无法转换“LazyFilterBidirectionalCollection>”类型的返回表达式
【发布时间】:2017-02-18 22:34:32
【问题描述】:

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

/SubmissionDataManager.swift:184:16: 无法转换返回 类型表达 'LazyFilterBidirectionalCollection>' 返回类型 '[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
}

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

【问题讨论】:

  • 你用什么来管理你的依赖关系?我注意到你问了几个这样的问题。如果使用 CocoaPods,请确保您的 pod 文件已针对 Swift 3 更新
  • 试试return Array(emptyEntryModels)。如果这不起作用,请尝试return Array(emptyEntryModels) as [EntryModel]
  • @vacawama,return Array(emptyEntryModels) 工作!如果需要,请将此添加为答案。
  • 我添加了我的答案,解释了Array(emptyEntryModels) 如何解决问题。

标签: ios arrays swift model realm


【解决方案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]

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    相关资源
    最近更新 更多