You can simplify your code a bit with enumerate() and indexOf() . Also, the function must return an optional tuple, because the element may not be present in the "matrix". Finally, you can make it general:
func indicesOf<T: Equatable>(x: T, array: [[T]]) -> (Int, Int)? { for (i, row) in array.enumerate() { if let j = row.indexOf(x) { return (i, j) } } return nil }
You can also make it an extension for a nested Array of Equatable elements:
extension Array where Element : CollectionType, Element.Generator.Element : Equatable, Element.Index == Int { func indicesOf(x: Element.Generator.Element) -> (Int, Int)? { for (i, row) in self.enumerate() { if let j = row.indexOf(x) { return (i, j) } } return nil } } if let (i, j) = a.indicesOf(7) { print(i, j) }
Swift 3:
extension Array where Element : Collection, Element.Iterator.Element : Equatable, Element.Index == Int { func indices(of x: Element.Iterator.Element) -> (Int, Int)? { for (i, row) in self.enumerated() { if let j = row.index(of: x) { return (i, j) } } return nil } }
source share