Массив с мощностью в Swift

Как инициализировать массив с максимальной емкостью без RepeatedValues?

var anotherThreeDoubles = Array(count: 3, repeatedValue: 2.5)

Как в этом примере с repeatValue. Можем ли мы инициализировать без ценности?

Ответы

Ответ 1

CMD-щелчок по типу Array в Xcode находит мне следующее определение функции (вместе с комментарием doc):

/// Ensure the array has enough mutable contiguous storage to store
/// minimumCapacity elements in.  Note: does not affect count.
/// Complexity: O(N)
mutating func reserveCapacity(minimumCapacity: Int)

Таким образом, вы можете указать массиву для предварительного размещения хранилища для заданной емкости, выполнив что-то вроде этого:

var results: [T] = []
results.reserveCapacity(100)

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


Чтобы обеспечить максимальную пропускную способность, не существует способа сделать это, если не выполнить собственный код, вручную помещая nil в массив Optional<T>, максимальный размер которого указан в комментарии @Bryan.

Ответ 2

ОБНОВЛЕНИЕ: Как говорит @chakrit, теперь вы можете использовать reserveCapacity. Это было добавлено в более поздних бета-версиях и теперь доступно в версии версии Swift.

Массивы в Swift работают иначе, чем в Objective-C. В Swift вы не можете создать массив с заранее выделенной памятью, но не содержать элементы. Просто создайте Array() и добавьте столько элементов, сколько хотите (3 в вашем случае).

Если вы абсолютно должны это сделать, используйте NSMutableArray следующим образом:

var anotherThreeDoubles = NSMutableArray(capacity: 3)

Надеюсь, я правильно понял вопрос. Не стесняйтесь объяснять далее.

Ответ 3

Для Swift 3.0 значение должно быть необязательным типом

    var arrImages = [UIImage?](repeating: nil, count: 64)

Ответ 4

Как сказал Джерней, вы можете использовать NSMutableArray в этом случае. Обратите внимание, что как NSMutableArray, так и Swift Arrays фактически не ограничивают количество элементов, которые вы можете добавить:

var anotherThreeDoubles = Array(count: 3, repeatedValue:10)
anotherThreeDoubles += 10 //another 3 doubles now has 4 elements

var arr: Array = NSMutableArray(capacity: 3)

arr.append(10)
arr.append(10)
arr.append(10)
arr.append(10) //arr now has 4 elements

Ответ 5

Несмотря на то, что существует функция reserveCapacity, она не рекомендует

из docs:

Типы массивов append (:) и append (методы contentOf:) позаботятся об этой детали для вас, но reserveCapacity (:) выделяет только столько места, сколько вы говорите (дополняется круглым значением), и нет Больше. Это позволяет избежать перераспределения, но может привести к тому, что вставка не будет амортизирована с постоянной производительностью.

Apple говорит, что лучше позволить функциям массива append и append(contentsOf:) позаботиться об этом для вас, если вы не знаете пропускную способность массива без вызова свойства count в коллекции. У них также есть пример на странице, с которой я связан выше.