2016-10-04 61 views
3

它只是將我的小雨燕項目斯威夫特3.斯威夫特3不能轉換類型的參數..預期參數類型「INOUT _」

這裏是我不明白一個編譯器錯誤:

var onLoadedClosures: [() ->()] = [] 
open func onLoaded(closure:() ->()) { 
    onLoadedClosures += [closure] 
} 

無法將類型'[() - >()]'的值轉換爲期望的參數類型'inout _'。

我加了INOUT關鍵字:

open func onLoaded(closure: inout() ->()) { 
     onLoadedClosures += [closure] 
    } 

然後,它的工作原理。但爲什麼向數組添加元素需要inout關鍵字?雖然我知道什麼意思。

回答

3

這是一個令人困惑的錯誤消息 - 問題是,你需要標記您的closure:參數作爲@escaping以使其逃過功能onLoaded(closure:)的壽命(按SE-0103,closure函數現在非逃逸默認)。

var onLoadedClosures: [() ->()] = [] 
open func onLoaded(closure: @escaping() ->()) { 
    onLoadedClosures += [closure] 
} 

當你標記參數作爲inout是因爲inout關閉被定義逃脫(如自己的價值得到在退出函數寫回給調用者),它的工作原理的原因。但是在這種情況下,根本不需要inout參數。

有關@escaping的詳細信息,請參閱the Swift evolution proposal上的更改以及this relevant Q&A

相關問題