2015-07-01 26 views
1

我想添加一個函數,告訴我索引是否超出數組範圍。Extend CollectionType add indexOutOfRange function

CollectionType的startIndex和endIndex似乎是通用的,所以我試圖僅在索引類型爲Int時限制擴展。 此代碼不能編譯:

extension CollectionType where Index.Type is Int { 
    public func psoIndexOutOfRange(index: Index.Type) -> Bool{ 
     return index < self.startIndex || index > self.endIndex 
    } 
} 

這可能嗎?什麼是添加這個的正確方法。

+0

「psoIndexOutOfRange」?這是一種[匈牙利符號](https://en.wikipedia.org/wiki/Hungarian_notation)嗎? –

回答

3

個人而言,我認爲這將是作爲一個擴展到Range,而不是CollectionType更好:

extension Range where T: Comparable { 
    func contains(element: Generator.Element) -> Bool { 
     return element >= startIndex && element < endIndex 
    } 
} 

,你可以調用像這樣(indices返回從集合的開始到結束索引的範圍):

[1,2,3].indices.contains(2) 

注意,CollectionType(其中Range符合)已經有一個contains方法 - 但通過線性查找。對於範圍,這會超載contains,以便在恆定時間內完成此操作。

另外,如果你這樣做是爲了將其與標取相結合,考慮添加一個可選的獲取,使事情變得更加容易:

extension CollectionType where Index: Comparable { 
    subscript(safe idx: Index) -> Generator.Element? { 
     guard indices.contains(idx) else { return nil } 
     return self[idx] 
    } 
} 

let a = [1,2,3] 
a[safe: 4] // nil 
+0

這很好,但是有一個問題,爲什麼將元素

+1

否 - endIndex是一個「哨兵價值」虛假值你代表你已經超過了最後一個有效的指數。因此,對於一個數組'[1,2,3]','endIndex'將會是3。 –

2

如何:

extension CollectionType where Index: Comparable { 
    public func psoIndexOutOfRange(index: Index) -> Bool{ 
     return index < self.startIndex || index >= self.endIndex 
    } 
} 

由於@MartinR建議的,如果你使用Comparable而不是限制IndexInt類型的更普遍。

+0

您可以使其略微更一般,因爲'where Index:Comparable' ... –