2015-04-13 3 views
1

Какова наилучшая практика проверки существования объекта (находится в пределах границ) по определенному индексу в массиве?Лучший способ проверить, находится ли объект за пределами массива

Было бы неплохо иметь это так просто, как это, но это, к сожалению, не представляется возможным:

let testArray = ["A", "B", "C", "D"] 

if let result = testArray[6] { 
    println("Result: \(result)") 
} 
else { 
    println("Result does not exist. Out of bounds.") 
} 

Должен ли я проверить против общего количества?

Спасибо!

+4

да, проверьте количество – Wain

ответ

15

Вы также могли бы сделать пристройку к массиву, так что вы сможете проверить с, если говоря:

extension Array { 
    func at(index: Int) -> Element? { 
     if index < 0 || index > self.count - 1 { 
      return nil 
     } 
     return self[index] 
    } 
} 

let arr = [1, 2, 3] 

if let value = arr.at(index: 2) { 
    print(value) 
} 
+0

использование необъявленного типа T? –

+1

@AnkitKumarGupta спасибо, что указали, что это устарело, код обновлен. :) – alkku

+0

Спасибо! Cheers ~~ –

1

Проверьте индекс объект, используемый должен быть больше или равен нулю, и должно быть меньше общее количество массива как это:

//Here index is object you want for 
if(index >= 0 && index < [yourArray count]) 
{ 
    //inside of array 
} 
else 
{ 
    //out of bound 
} 
+0

Хорошо, спасибо за ваш быстрый ответ! – fisher

+1

Я думаю, '<=' должно быть '> ='. – keithbhunter

+1

Это цель-C. Вероятно, вы имели в виду 'if index

-1

чтобы проверить, является ли индекс находится внутри границ массива в стрижа вы бы использовать

if index < testArray.count { 
    //index is inside bounds 
} else { 
    //index is outside bounds 
} 
0

@alkku имеет его, но для простоты и использование наиболее недогружена синтаксической формы на всех языках ?::

extension Array { 
    func atIndex(index: Int) -> T? { 
     return (0 <= index && index < self.count 
       ? self[index] 
       : nil) 
    } 
} 
5

Вы можете использовать оператор ~= в сочетании с функцией indices, что ярлык для создания диапазон полного диапазона индекса контейнера:

let a = [1,2,3] 
let idx = 3 // one past the end 

if indices(a) ~= idx { 
    println("within") 
} 
else { 
    println("without") 
} 

Единственное, что следует отметить, это работает с любым типом контейнера, который имеет сопоставимый индекс, а не только те, как массив, которые имеют целочисленные индексы. Думая индексы, как числа, как правило, хорошая привычка, чтобы выйти из, так как он помогает вам думать в более общем об алгоритмах на контейнеры без этих индексов, таких как строки или словари:

let s = "abc" 
let idx = s.endIndex 

idx < count(s) // this won't compile 

idx < s.startIndex // but this will 

// and so will this 
if indices(s) ~= idx { 
    println("within") 
} 
else { 
    println("without") 
} 

более общего ваших алгоритмы, то больше шансов, что вы сможете разложить их на дженерики и увеличить повторное использование.

+0

Это один «уродливый» оператор; похоже, что он присваивает 'lhs' результат' lhs ~ rhs' - как и другие операторы ' ='. – GoZoner

+0

Согласитесь, я думаю, что это awk-вдохновило. ~ == было бы лучше ИМХО. –

+0

Или даже лучше, что «Range» будет иметь оператор contains, но, к сожалению, он не сможет воспользоваться преимуществами компаратора, поскольку индексы диапазона не ограничены. –