2015-02-09 72 views
0

我想篩選出一個可選項的數組並解包它們。 所以我寫了以下擴展到Array結構,但我得到的錯誤:'T'不是'UInt8'的子類型Array <T>擴展到篩選和解包選項

任何想法,如果這可能與swift?

extension Array { 
    func filterOptionals() -> [T] { 
     return filter({$0 != nil }).map({$0!}) 
    } 
} 

回答

0

該數組可以包含任何類型的元素,它不一定是'Optional<T>'。目前不可能編寫泛型類型的專用擴展,並且可能永遠不會。我們必須改用全局功能:

func filterOptionals<T>(array: [T?]) -> [T] { 
    return array.filter {$0 != nil } .map {$0!} 
} 
+0

我有同樣的功能,作爲一個全球性的功能,但我想額外的便利性和天然功能性鏈接到能夠做到:object.getMixedArray.filterOptionals()DoSomething的() – 2015-02-09 23:20:41

+0

不幸的是,這是不可能。您可以改爲使用後綴運算符,或將數組包裝到另一個結構ArrayOfOptionals 。 – 2015-02-09 23:28:30

+0

是的,運營商可能是一個好方法。謝謝Ivica – 2015-02-10 00:01:00

0

是的,這是可能的。這裏是如何:

extension Array { 
    func catOptionals<A>() -> [A] where Element == A? { 
     return self.flatMap{ $0 } 
    } 
}