2017-04-01 120 views
1

我已經定義了一個協議和一個數組擴展。編譯器在擴展的編碼方法中調用flatMap時報告錯誤:無法轉換類型'T?'的值到閉合結果類型「_」爲什麼編譯器會抱怨我的變換參數爲FlatMap?

public protocol Encodable { 
    typealias Properties = Dictionary<String, Any> 
    func encode() -> Properties 
    init?(_ properties: Properties?) 
} 

extension Array where Element : Encodable.Properties { 
    func encode<T:Encodable>(type: T.Type) -> [T] { 
     return flatMap{ T($0) } // <= Compiler Error 
    } 
} 
  • 編譯器已明顯發現,在可編碼協議中定義的初始化 - T($ 0)將產生一個T 1。
  • flatMap有一個適當的重載應該產生一個[T]。
  • 我不知道什麼「封閉結果類型'_'」可能意味着什麼。

的Xcode 8.3是使用SWIFT 3.1(也許我不應該Xcode更新?)

任何想法?

+0

儘量只'flatMap(T.init)'。這不僅是可取的,但它也可能導致更有用的錯誤信息 – Alexander

回答

2

編譯你的代碼在一個小項目,我可以找到另一個錯誤:

<unknown>:0: error: type 'Element' constrained to non-protocol type 'Encodable.Properties' 

因此,約束Element : Encodable.Properties無效,斯威夫特無法找到一個合適的初始化爲T($0)。經常發現Swift在與類型推斷相關的問題中會產生不適當的診斷。

據我測試,這個代碼編譯與夫特3.1/8.3的Xcode:

extension Array where Element == Encodable.Properties { 
    func encode<T:Encodable>(type: T.Type) -> [T] { 
     return flatMap{ T($0) } 
    } 
} 
+0

非常感謝! – Verticon

相關問題