2014-11-22 35 views
3

如何在Swift的類型系統中說「如果元素類型T符合協議Q」,則Array<T>符合協議P「?在Swift中有條件地解除一般類型的協議

我在這個問題上,在那裏PQ是同一協議的一個更具體的版本實際上感興趣的是:你說「如果數組的元素是P -conforming,則該數組爲P -conforming 」。這是迄今爲止我所擁有的。 (我想一個簡單的快速檢查庫,從http://chris.eidhof.nl/posts/quickcheck-in-swift.html開始:Arbitrary,標誌着可以隨機生成的類型)

protocol Arbitrary { 
    class func arbitrary() -> Self 
} 
extension Array { 
    static func arbitrary<T where T : Arbitrary>() -> [T] { 
     // code to create a random-length list of T objects 
     // using T.arbitrary() for each one 
    } 
} 
extension Array<T where T : Arbitrary> : Arbitrary {} 

這失敗,出現錯誤

extension of generic type 'Array' cannot add requirements 
extension Array<T where T : Arbitrary> : Arbitrary {} 
+0

對於未來的Google:檢查斯威夫特的當前狀態,這個功能(暫定)計劃的一部分「[完成泛型](http://thread.gmane.org/gmane.comp.lang.swift.evolution/8484)「 – Tikitu 2016-05-13 08:45:18

回答

1

你不能做到這一點在Swift中,因爲你無法進一步限制泛型類型。例如,您不能將方法添加到僅在TComparable時纔有效的方法- 這就是爲什麼處理泛型類型(地圖,過濾器,排序等)有這麼多全局函數的原因。

從開發論壇最近的Chris Lattner的帖子來看,這聽起來像Swift的開發人員正朝着這個方向前進,但這還遠遠沒有。看看你是否能實現你試圖做限制TArbitrary全局函數是什麼:

func arbitrary<T: Arbitrary>() -> [T] { 
    // .. 
}