2014-09-17 3 views
0

Я создаю простой выбор в Swift. В моем методе сортировки я получаю сообщение об ошибке при вызове метода для обмена значениями внутри массива. МетодСортировка сортировки в Swift

class func sort(a:[String]) { 
     var N = a.count 
     for(var i = 0; i < N; i++) { 
     var min = i 
     for(var j = i+1; j < N; j++) { 
      if(less(a[i], str2:a[j])) { 
       min = j 
      } 
     } 
     exch(&a, i, min) // Error: [String] not convertible to @value inout $T3 
     } 
    } 

Exch:

class func exch(inout a:[String], i:Int, j:Int) { 
     let temp = a[i] 
     a[i] = a[j] 
     a[j] = temp 
    } 

Спасибо за помощь! :)

ответ

1

аргументов неизменны по умолчанию, в то время как inout параметров изменчивы, поэтому проблема заключается в том, что вы не можете преобразовать непреложный a в изменяемый inout параметра. вы должны объявить его с var, чтобы сделать его изменяемым

class func sort(var a:[String]) { // declare a with var. by default it is using let 
    var N = a.count 
    for(var i = 0; i < N; i++) { 
    var min = i 
    for(var j = i+1; j < N; j++) { 
     if(less(a[i], str2:a[j])) { 
      min = j 
     } 
    } 
    exch(&a, i, min) // Error: [String] not convertible to @value inout $T3 
    } 
0

Я играл со следующим использованием быстрого 3. Надеюсь, что это поможет некоторым людям, которые приходят сюда.

import Cocoa 

func ints(cnt: Int, ceiling: Int) -> [Int] { 
    var arr = [Int]() 
    for _ in 0 ..< cnt { 
     arr.append(Int(arc4random_uniform(UInt32(ceiling)))) 
    } 
    return arr 
} 

func selection(arr: inout [Int]) { 
    for i in 0..<arr.count - 1 { 
     var k = i 
     for j in i + 1..<arr.count where arr[j] < arr[k] { 
      k = j 
     } 
     if k != i { 
      swap(&arr[k], &arr[i]) 
     } 
    } 
} 

let a = ints(cnt: 10, ceiling: 100) 
print(a) 

var b = a 
selection(arr: &b) 
print(b) 

выход:

[13, 30, 68, 19, 1, 4, 28, 65, 96, 13] 
[1, 4, 13, 13, 19, 28, 30, 65, 68, 96] 
Смежные вопросы