arrays - What type should you use when you want to use index.advanceBy? -
i wanted find objects near object in array. thought write extension method this, error:
// error: cannot invoke 'advanceby' argument list of type '(int)'
the int
type wrong, indexof
method takes self.distance
argument , i'm not sure how use parameter type.
extension collectiontype generator.element : equatable { func objectnear(object: self.generator.element, indexmodifier: int) -> self.generator.element? { if let index = self.indexof(object) { let newindex = index.advancedby(indexmodifier) // doesn't work //let newindex = index.advancedby(1) // this works if self.indices.contains(newindex) { return self[newindex] } } return nil } }
(if there more swifty approach i'd happy hear it, i'd understand above in case.)
collectiontype
has method
public func indexof(element: self.generator.element) -> self.index?
and conforms to
public protocol indexable { typealias index : forwardindextype // ... }
finally, forwardindextype
has method
public func advancedby(n: self.distance) -> self
therefore correct type index.distance
:
func objectnear(object: self.generator.element, indexmodifier: index.distance) -> self.generator.element? { ... }
but note advancing index beyond endindex
can crash, e.g. character collections:
let c = "abc".characters print(c.objectnear("b", indexmodifier: 1)) // optional("c") print(c.objectnear("b", indexmodifier: 2)) // nil print(c.objectnear("b", indexmodifier: 3)) // fatal error: can not increment endindex
a safe variant is:
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 }
alternatively, if need method collections indexed int
(such array
) can define
extension collectiontype 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 } }
Comments
Post a Comment