0

我正在 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
       }
    }

交换方法:

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

谢谢您的帮助!:)

4

2 回答 2

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
   }
于 2014-09-17T23:47:11.000 回答
0

我使用swift 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]
于 2017-04-06T11:16:51.303 回答