2017-10-19 51 views
3

推斷我有這使得從嵌套陣列分層陣列的功能。它適用於int數組。錯誤:泛型參數「T」不能在迅速

let array: [Any] = [1, 2, [3]] 

func makeFlatArray(_ array: [Any]) -> [Int] { 
    var flatArray = [Int]() 
    for item in array { 
     if let item = item as? Int { 
      flatArray.append(item) 
     } else if let item = item as? [Any] { 
      let result = makeFlatArray(item) 
      flatArray += result 
     } 
    } 
    return flatArray 
} 

但我想使它通用,我嘗試時出現錯誤。

func makeFlatArrayGeneric<T>(_ array: [Any]) -> [T] { 
    var flatArray = [T]() 
    for item in array { 
     if let item = item as? T { 
      flatArray.append(item) 
     } else if let item = item as? [Any] { 
      let result = makeFlatArrayGeneric(item) 
      flatArray += result 
     } 
    } 
    return flatArray 
} 

錯誤:

Playground execution failed: 

error: FlatNestedArraysExample.playground:22:26: error: generic parameter 'T' could not be inferred 
      let result = makeFlatArrayGeneric(item) 
         ^

FlatNestedArraysExample.playground:16:6: note: in call to function 'makeFlatArrayGeneric' 
func makeFlatArrayGeneric<T>(_ array: [Any]) -> [T] { 

回答

5

你必須告訴編譯器

func makeFlatArrayGeneric<T>(_ array: [Any]) -> [T] { 
    var flatArray = [T]() 
    for item in array { 
     if let item = item as? T { 
      flatArray.append(item) 
     } else if let item = item as? [Any] { 
      let result: [T] = makeFlatArrayGeneric(item) 
      flatArray += result 
     } 
    } 
    return flatArray 
} 

let array: [Any] = [1, 2, [3], [4, [5]]] 
let items: [Int] = makeFlatArrayGeneric(array) //[1, 2, 3, 4, 5] 

一個功能更強大的方法來解決你的問題的類型T.

的。

extension Array { 
    func flatten() -> Array<Element> { 
     return self.flatMap({ element -> [Element] in 
      if let array = element as? Array { 
       return array.flatten() 
      } else { 
       return [element] 
      } 
     }) 
    } 
} 

let items: [Int] = array.flatten() //[1, 2, 3, 4, 5] 
+0

感謝您的回答! –

+0

不客氣:) – Yannick

0

你必須做一些事情,使迅速意識到什麼是T,要做到這一點的一種方法是將返回值賦給它的類型是已知變量:

let result: [T] = makeFlatArrayGeneric(item) 

另一種方式是通過類型作爲參數:

func makeFlatArrayGeneric<T>(_ array: [Any], type: T.Type) -> [T] { 
    var flatArray = [T]() 
    for item in array { 
     if let item = item as? T { 
      flatArray.append(item) 
     } else if let item = item as? [Any] { 
      let result = makeFlatArrayGeneric(item, type: type) 
      flatArray += result 
     } 
    } 
    return flatArray 
} 

,並調用它是這樣的:

makeFlatArrayGeneric(yourArray, type: Int.self)