2017-02-18 43 views
0

我正試圖遷移Swift 2.2 iOS應用程序,我沒有寫入Swift 3.有一些函數使用Realm來獲取模型並將它們返回到數組中。這些都在Swift 2.x中工作,但在Swift 3中產生了下面的錯誤。我還包含了相關的函數定義。無法轉換類型'LazyFilterBidirectionalCollection>'的返回表達式

/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 
} 

我不知道實際問題是什麼,或者我會如何解決它。任何建議感激。

+0

:使用此Array初始化的序列轉換爲數組的


其他的例子嗎?我注意到你正在問這樣的幾個問題。如果使用CocoaPods – Pierce

+0

嘗試'return Array(emptyEntryModels)',請確保您的pod文件已更新爲Swift 3。如果這不起作用,請嘗試'將Array(emptyEntryModels)作爲[EntryModel]'返回。 – vacawama

+0

@vacawama,'return Array(emptyEntryModels)'工作!如果你願意,可以添加這個答案。 – Lastmboy

回答

1

爲了效率的緣故,Swift推遲了數組的創建。它不是給你一個數組,而是給你提供一個LazyFilterBidirectionalCollection這是一個懶惰的包裝器,它包含了滿足謂詞的底層集合的元素。在你的情況下,這是Realm元素滿足你通過filter的封閉。 懶惰意味着當您訪問它們而不是一次全部時,這些值將從Realm中提取。 A Collection是符合SequenceIndexable的協議。 A Sequence是一種對其元素提供順序迭代訪問的類型。所以,在最基本的層面上,LazyFilterBidirectionalCollection是一個序列。

沒有爲Array一個初始化一個Sequence轉換成數組:

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

既然你需要返回真正的數組

取代:

return emptyEntryModels 

有:

return Array(emptyEntryModels) 

這將從LazyFilterBidirectionalCollection做出一個合適的數組。什麼是你用它來管理你的依賴

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] 
相關問題