2014-12-22 4 views
1

Я попытался написать только простую функцию Bubble-сортировки:Почему не этот [Int] -Element типа 'Int'?

func bubbleSort(array: [Int]) -> [Int] { 
    while !isSorted(array) { 
     for index in 1..<array.count { 
      if array[index - 1] > array[index] {     
       let temp: Int = array[index] 
       array[index] = array[index - 1] 
       array[index - 1] = temp 
      } 
     } 
    } 

    return array 
} 

Чтобы проверить, когда массив отсортирован он использует:

func isSorted(array: [Int]) -> Bool { 
    for index in 1..<array.count { 
     if array[index - 1] > array[index] { 
      return false 
     } 
    } 

    return true 
} 

Я использовал http://swiftstub.com/ для компиляции кода, но он дал меня следующие сообщения об ошибке:

<stdin>:17:17: error: '@lvalue $T11' is not identical to 'Int' 
array[index] = array[index - 1] 
^ 
<stdin>:18:17: error: '@lvalue $T8' is not identical to 'Int' 
array[index - 1] = temp 
^ 

(Если вы хотите, чтобы проверить его на сайте: http://swiftstub.com/385904096/)


Как array[index] и array[index - 1] не оба типа Int, и как они могут быть даже разных типов?

ответ

1

Это потому, что массив, переданный функции, неизменен. Для того, чтобы сделать его изменчивым, вы должны передать его по ссылке с помощью inout модификатора:

func bubbleSort(inout array: [Int]) -> [Int] { 

к сведению, что при использовании inout, вы должны пройти соответствующий параметр в качестве ссылки с помощью оператора & при вызове функция:

let res = bubbleSort(&myArray) 

отметить также, что для замены 2 переменных, вы можете просто использовать:

swap(&array[index], &array[index - 1]) 

Предлагаемое чтение: In-Out Parameters

+0

Не передает ли этот массив по ссылке, что означает, что он изменит исходную версию массива? –

+0

Вы должны использовать '&' operator - прочитать обновленный ответ, но также прочитать связанную документацию – Antonio

+0

Ну, точно ... Предположим, что я не хотел передавать массив по ссылке, чтобы исходная версия не была изменилось. Как мне это сделать? –

Смежные вопросы