2016-03-13 2 views
1

Я делаю первые шаги в 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 '[_]' 

Я чего-то не хватает?

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

+1

возможно постить реальный код, который дает ошибку .... –

+0

I добавлен полный код проекта. Функция обмена фактически ничего не делает с массивом, поэтому это минимальный пример. – shadowhorst

ответ

3

Он работает со следующими изменениями:

  • массив передается в него должны быть вар , As mentioned in the documentation, inouts нельзя допускать или писать.

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

  • элементы в декларации также должны быть Inout, чтобы указать, что он должен быть Var снова


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) 
+0

Отлично! Спасибо! – shadowhorst

-3

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

например.

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

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

+1

Да, я знаю. Но это не проблема, о которой я просил. – shadowhorst

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