2015-05-22 3 views
4

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

Я понимаю, что Swift обычно проходит массив по значению, а не по ссылке, но мне нужно, чтобы иметь возможность передать ссылку в коде так:

var arr1 = [1, 2, 4] 
var arr2 = [4, 6, 3] 
var result = pickOne() ? arr1 : arr2 
result[2] = 7 
// one of these should be updated, currently they are just as initialized 
println(arr1) 
println(arr2) 

Я хочу, чтобы динамически выбирать один из двух массивов , и внести изменения в этот массив. Оба массива имеют одинаковый размер и тип контента, и я бы только менял элементы, а не добавлял или удалял. Как я могу это достичь?

Редактировать: Является ли ответ только для использования NSMutableArray?

Просто уточнить: pickOne() - это функция, которую у меня уже есть, и на основе результатов этой функции я хочу изменить первый или второй массив. Поэтому мне не нужна помощь в выборе того, что выбрать. Мне нужна помощь в определении того, как внести изменения (и их будет несколько) в этот желаемый массив без необходимости проверять, какой массив использовать для каждой модификации.

я мог бы сделать что-то вроде этого:

if pickOne() { 
    // work on arr1 
    // ... 
} else { 
    // work on arr2 
    // ... 
} 
// do some other work 
// ... 
if pickOne() { 
    // work more on arr1 
    // ... 
} else { 
    // work more on arr2 
    // ... 
} 
// do yet another set of things 
// ... 
if pickOne() { 
    // work again on arr1 
    // ... 
} else { 
    // work again on arr2 
    // ... 
} 

Но это надоедает быстро.

Редактировать До сих пор я достиг некоторого прогресса здесь

var result = pickOne() ? UnsafeMutableBufferPointer(start: &arr1, count: arr1.count) : UnsafeMutableBufferPointer(start: &arr2, count: arr2.count) 

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

+0

Вы действительно спрашиваете, как передать массив по ссылке, чтобы его можно было изменить (так как уже есть много прошлых вопросов и справочных материалов по легко доступным данным) или как динамически выбрать, какой из них пройти? – Gruntcakes

+0

Как пройти по ссылке. Все примеры, которые я видел, полагаются на ключевое слово 'inout' и используют дополнительные функции, которые становятся довольно громоздкими, и до сих пор мне не повезло, что он действительно работал для этого варианта использования. – SaltyNuts

+0

Похож, что 'UnsafeMutableBufferPointer' делает трюк, но черт возьми, это уродливо. – SaltyNuts

ответ

1

Вы не можете сделать это с помощью Swift массива структур, смотрите ниже:

«Назначение и копирование поведения для струнных, Массивы и словарей Свифта строка, массив, и типы словарей реализованы в виде структур. Это означает, что строки, массивы и словари копируются, когда они назначаются новой константе или переменной или когда они передаются функции или методу.

Это поведение отличается от NSString, NSArray и NSDictionary в Foundation, которые реализованы как классы, а не структуры. Экземпляры NSString, NSArray и NSDictionary всегда назначаются и передаются как ссылка на существующий экземпляр, а не как копия «

Выдержка из: Apple Inc.« Язык быстрого программирования ». IBooks. https://itun.es/ca/jEUH0.l

+0

В некотором смысле они похожи на структуры, в некотором смысле это не так. Не поклонник того, как Apple справилась с этим. См. Https://devforums.apple.com/thread/228695?start=0&tstart=0 для более подробного обсуждения (для регистрации необходимо зарегистрировать Apple dev). – SaltyNuts

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