使用Xcode 8測試版,swift 3不能編譯第二個擴展。我不明白這是一個很快的bug還是一個已知的限制。 (Element,T) - > T的確是函數的類型。 所以我不明白爲什麼編譯器期望(,) - > __ ,什麼是這種類型的意思是旁邊「我不關心型」爲什麼Swift類型的系統嘗試將類型轉換爲錯誤的預期參數
-1
A
回答
1
這是不是一個錯誤或限制,它只是編譯器不可能在編譯時確定first
在第二個擴展中的類型爲T
(因爲T
不一定與Iterator.Element
相同)。在你的關閉中,編譯器知道first
的類型爲Iterator.Element
,但編譯器無法知道這是否也是類型T
。
在您的第一個擴展中,您只使用first
作爲combine
閉包的第一個參數,因爲它只需要Iterator.Element
類型,所以一切都很好。
在你的第二個延伸,但是,你試圖傳遞first
作爲參數傳遞給它期望類型T
參數(initial
),編譯器無法知道first
是否真的是T
型(同一類型T
的13759 combine
閉包用於呼叫雙參數scanl
),即Iterator.Element
的self
的類型爲T
。這可以通過first
到T
的嘗試類型轉換(as?
)在第二個擴展的可選綁定條款中輕易兌換。
extension Array {
func scanl<T>(combine: (Iterator.Element, T) -> T) -> [T] {
guard let first = self.first as? T else { return [] }
return Array(self.dropFirst()).scanl(initial: first, combine: combine)
}
}
如果構建一個掃描類型的數組來構造另一種類型,例如陣列的例子Iterator.Element
和T
不一定是相同類型的事實是明顯的
/* scant [Int] array to construct [String] array */
let foo = [1, 2, 3, 4, 5]
let bar = foo.scanl(initial: "0") { String($0) + $1 }
print(bar) // ["0", "10", "210", "3210", ""]
如果你只喜歡你scanl
方法,其集電極產生相同類型的數組(作爲一個被掃描),那麼你就不需要包括通用T
,但可以使用到位Iterator.Element
類型T
在你的分機上面。
相關問題
- 1. 不能類型的值轉換爲預期的參數類型
- 2. firebase swift 3轉換:無法將類型'(_) - >()'的值轉換爲期望的參數類型'((錯誤) - >無效)?
- 3. Swift:無法將類型'NSDate'的值轉換爲期望的參數類型'NSDateComponents'
- 4. Swift:無法將類型'GameScene'的值轉換爲期望的參數類型'UIViewController!'
- 5. 無法將類型'NSMutableURLRequest'的值轉換爲預期的參數類型'SessionManager'
- 6. 無法將類型'UIView'的值轉換爲預期的參數類型'UIWebView'
- 7. 無法將類型「ViewController.Type」的值轉換爲預期的參數類型「UIViewController」
- 8. 無法將int類型的值轉換爲預期的參數類型CGGradientDrawingOptions
- 9. 無法將'Int.Type'類型的值轉換爲預期的參數類型'Int'
- 10. 無法將Float類型的值轉換爲預期的參數類型NSNumber
- 11. 無法將類型NSRange的值轉換爲預期的參數類型
- 12. 無法將「String」類型的值轉換爲預期的參數類型「URL」
- 13. 無法將int類型的值轉換爲預期的參數類型'CGfloat'
- 14. 爲什麼我無法將類型Bool的值轉換爲預期的參數類型字符串
- 15. swift Xcode單元測試:無法將類型「Person」的值轉換爲預期參數類型「Person」
- 16. 無法將Double轉換爲預期的參數類型CGFloat
- 17. 無法將類型'(NSDate) - > NSTimeInterval的值轉換爲預期參數類型'Double'
- 18. 無法將類型'(_,_) - >()'的值轉換爲預期參數類型UserProfile.Completion'Swift 3
- 19. Swift無法將類型值轉換爲Realm中的預期參數
- 20. 爲什麼javascript將我的日期轉換爲數字類型
- 21. 無法將[AnyObject]類型的值轉換爲期望的參數類型[PFObject] - 解析&Swift II錯誤
- 22. Swift 4錯誤:「無法將類型'URLRequest'的值轉換爲期望的參數類型'URL!'」
- 23. Swift Closure - 無法轉換類型(_) - >()的值?預期的參數類型(() - >())?
- 24. 無法將類型'(FIRUser,_) - >()'的值轉換爲'FIRAuthResultCallBack'的預期參數類型錯誤
- 25. 錯誤「不能轉換類型的值‘詮釋’預期參數類型‘UINT’
- 26. 無法轉換類型'String!'的值預期參數類型錯誤
- 27. 無法將值類型「」轉換爲預期參數「UInt64'
- 28. 將類型轉換爲IDisposable - 爲什麼?
- 29. 無法將類型Appdata的值轉換爲預期的參數類型Object.type Realm Swift
- 30. Swift結束:無法將類型'(_) - > Bool'的值轉換爲預期的參數類型
我不鼓勵在這裏使用遞歸,因爲它會複製每個調用的整個數組,導致'O(n^2)'的時間複雜度。你只需使用for循環即可。 –