Массив с мощностью в 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
в коллекции. У них также есть пример на странице, с которой я связан выше.