Я очень новичок в Swift и для программирования Apple в целом. Я написал этот код для двоичного поиска.Унифицированные массивы и массивы в Swift
func binarySearch<X:Comparable> (needle:X, haystack:[X])->X? {
if haystack.isEmpty { return nil }
let mid = haystack.count/2
let found = haystack[mid]
if found == needle {
return needle
}
else if found < needle {
return binarySearch(needle, haystack[0..<mid])
}
else {
return binarySearch(needle, haystack[mid+1..<haystack.count])
}
}
и я получил ошибки синтаксиса на рекурсивных вызовов, поскольку второй параметр имеет тип ArraySlice<X>
вместо Array<X>
.
Я имел дело с этим, перегружая binarySearch версией, которая идентична, за исключением того, что второй параметр имеет тип ArraySlice<X>
.
Я думаю, что было бы более элегантно, если бы все могло быть сделано в одной функции. Есть ли подходящий тип, который объединяет как Array, так и ArraySlice? Я пробовал использовать ArrayLiteralConvertible<X>
, но по какой-то причине у него нет счетчика. У меня все еще есть проблемы с поиском путей в документах, поэтому я могу легко упустить возможность выбора.
Можете ли вы предложить хороший способ сделать это? Если это связано с использованием встроенного класса, можете ли вы дать мне совет о том, как найти его для себя в следующий раз, вместо того, чтобы писать в SO?
Ницца! - Возможно, добавьте информацию о том, что это Swift 2.0, и требует Xcode 7 beta. –
Упс. Ты мертв. Я добавлю его туда (и я могу начать * пытаться * добавить версию Swift 1.2 ...) – oisdk
На самом деле мне не нравится использовать здесь switch/case (с искусственным стандартом по умолчанию, чтобы сделать компилятор счастливым) вместо этого простого if/else, если/else. Но это вопрос вкуса :) –