2015-08-08 4 views
2

Я знаю, что swift имеет как ссылочные типы, так и типы значений. И я знаю, что Int - это тип значения. Но как я могу хранить ссылку на целое число?Как сохранить ссылку на целое число в Swift

var x:Int = 1 
var y:Int = x // I want y to reference x (not copy) 
++y 
println(x)  // prints 1, but I want 2 

Я попытался использовать типы в штучной упаковке, и я попытался использовать массив Int, но не работает для хранения ссылки на целое число.

Я думаю, я могу написать мой собственный

class IntRef { 
    var a:Int = 0 
    init(value:Int) { a = value } 
} 

var x:IntRef = IntRef(value: 3) 
var y = x 
++y.a 
println(x.a) 

кажется немного неудобно.

+0

В чем смысл «хранения ссылки на целое число»? * Так как ** целые числа неизменны ** это не правильный запрос. * Вместо «вложенного типа» (например, Integer Java, который делает * не * влияет на изменчивость) отдельный * изменяемый контейнер *, как показано, может быть используемый. – user2864740

+0

(эквивалент в Java к * изменяемому контейнеру * будет что-то вроде ['Holder '] (http://docs.oracle.com/javase/7/docs/api/javax/xml/ws/Holder.html), а не 'Integer'.) – user2864740

+0

Думаю, я должен сказать:« Как сохранить ссылку на целочисленную переменную ». Думаю, это не очевидно всем. –

ответ

4

К сожалению, в Свифте нет ссылочного типа Integer или что-то в этом роде, поэтому вам нужно самому сделать Box-Type.

Например родовая один:

class Reference<T> { 
    var value: T 
    init(_ value: T) { self.value = value } 
} 
+0

Я бы назвал это чем-то другим, чтобы избежать спутанность сознания. По-прежнему не сохраняется «целая ссылка», например. – user2864740

+0

@ user2864740 Я бы прочитал его как «Ссылка» на «Что-то». Как бы вы это назвали? Может быть, «ReferenceTo»? – Qbyte

+0

К счастью :-) – shallowThought

-1

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

var x:Int = 1 
var setx = { (a:Int) in x = a } 
var getx = { x } 
setx(getx() + 1) 
println(x)    // This will print 2 

Я не рекомендую фактически определять getx/setx. Определите закрытие, которое выполняет определенную задачу для вашего приложения.

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