2015-11-06 51 views
4

我有兩個協議ValidResetable以及inputViews的數組,其類型爲[Valid]。這一切都很好。所以,現在我已經得到了我的Resetable協議:無法將陣列成員向下排協議類型

protocol Resetable: class { 
    func reset() 
} 

現在,inputViews裏面的一切也符合Resetable協議,所以我想要做的基本上是循環遍歷每個部件上叫reset()。如果我這樣做,那麼它會工作:

for input in inputViews { 
     (input as! Resetable).reset() 
    } 

,但我已經擴展Array下列要求:

extension Array where Element:Resetable { 
    func resetAll() { 
     forEach({ $0.reset() }) 
    } 
} 

所以,我真的希望能夠做的就是垂頭喪氣inputViews完全和調用resetAll()

我想:

let resetableViews = inputViews.map({ $0 as! Resetable }) 
    resetableViews.resetAll() 

但它說Using Resetable as a concrete type conforming to Resetable is not supported

我如何使用resetAll()實現這一目標?

+0

重置實際上有兩個T的,像拼寫遺忘/令人遺憾,但不像可刪除/耗竭,或銷售/袖珍。 – Jessy

+2

比較http://stackoverflow.com/questions/33112559/protocol-doesnt-conform-to-itself。 –

回答

0

我希望我已經理解了問題/規格。羅布納皮爾自由採取,怎麼樣:

protocol Resettable { 
    func reset() -> Resettable 
} 

struct ResettableArray { 
    var array: [Resettable] 
    init(_ array:[Resettable]) { self.array = array } 
    func resetAll() -> [Resettable] { 
     return array.map({ $0.reset() }) 
    } 
} 

class dummy: Resettable { 
    func reset() -> Resettable { 
     print("Reset one element") 
     return self 
    } 
} 

let resettableDummy = ResettableArray([dummy(), dummy()]) 
resettableDummy.resetAll()