Swift: inout с общими функциями и ограничениями

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

Во-первых, точка запуска моего приложения:

import Foundation

let sort = Sort()
sort.sort(["A", "B", "C", "D"])

И вот мой класс с актуальной проблемой:

import Foundation

class Sort {
    func sort<T:Comparable>(items:[T]){
        let startIndex = 0
        let minIndex = 1
        exchange(&items, firstIndex: startIndex, secondIndex: minIndex)
    }

    func exchange<T:Comparable>(inout array:[T], firstIndex:Int, secondIndex:Int) {
        // do something with the array
    }
}

Я получаю следующую ошибку в Xcode на линии вызова exchange:

Cannot convert value of type '[T]' to expected argument type '[_]'

Я что-то здесь упускаю?

Обновление: добавлен полный код проекта.

2 ответа

Решение

Работает со следующими модификациями:

  • передаваемый в него массив должен быть var. Как упомянуто в документации, входы не должны быть разрешены или литералы.

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

  • элементы в объявлении также должны быть inout, чтобы указать, что это должно быть снова


import Foundation


class Sort {
    func sort<T:Comparable>(inout items:[T]){
        let startIndex = 0
        let minIndex = 1
        exchange(&items, firstIndex: startIndex, secondIndex: minIndex)
    }

    func exchange<T:Comparable>(inout array:[T], firstIndex:Int, secondIndex:Int) {
        // do something with the array
    }
}


let sort = Sort()
var array = ["A", "B", "C", "D"]
sort.sort(&array)

Вы можете "обменять" два значения в массиве, используя функцию swift swap.

например

var a = [1, 2, 3, 4, 5]
swap(&a[0], &a[1])

будет означать, что a сейчас [2, 1, 3, 4, 5]

Другие вопросы по тегам