CollectionType has a method
public func indexOf(element: Self.Generator.Element) -> Self.Index?
and corresponds
public protocol Indexable {
typealias Index : ForwardIndexType
}
Finally ForwardIndexTypehas a method
public func advancedBy(n: Self.Distance) -> Self
Therefore, the correct type is Index.Distance:
func objectNear(object: Self.Generator.Element, indexModifier: Index.Distance) -> Self.Generator.Element? { ... }
, endIndex ,
:
let c = "abc".characters
print(c.objectNear("b", indexModifier: 1))
print(c.objectNear("b", indexModifier: 2))
print(c.objectNear("b", indexModifier: 3))
:
func objectNear(object: Generator.Element, indexModifier: Index.Distance) -> Generator.Element? {
if let index = indexOf(object) {
if indexModifier > 0 && index.distanceTo(endIndex) <= indexModifier {
return nil
}
if indexModifier < 0 && startIndex.distanceTo(index) < -indexModifier {
return nil
}
return self[index.advancedBy(indexModifier)]
}
return nil
}
, ,
Int (, Array),
extension CollectionType where Generator.Element : Equatable, Index == Int {
func objectNear(object: Generator.Element, indexModifier: Int) -> Generator.Element? {
if let index = self.indexOf(object) {
let newIndex = index + indexModifier
if indices.contains(newIndex) {
return self[newIndex]
}
}
return nil
}
}