Swift массив разных типов - PullRequest
0 голосов
/ 08 января 2020

Поскольку я знаю, что массив является типом значения в Swift, здесь нет ссылок.

Не могли бы вы объяснить мне следующую ситуацию:

var arr: [Any] = [1, "1", UIView(), "qwerty"]
print(arr[3] as! String)

Как называется "arr [3]" O (1) операция. Как можно получить третий элемент без итерации?

Ответы [ 2 ]

1 голос
/ 08 января 2020

Поскольку я знаю, что массив является типом значения в Swift, ссылок нет.

Вторая половина неверна. Тип T, являющийся типом значения, просто означает, что этот код печатает «1, 2» вместо «2, 2»:

var a = T()
a.someIntProperty = 1
var b = a
b.someIntProperty = 2
print("\(a.someIntProperty), \(b.someIntProperty)")

Тип значения / ссылки подразумевает набор поведений, не так, как тип реализован внутри.

Как вы сказали, чтобы доступ к массиву работал в O (1) время, массив должен содержать указатели на элементы массива, которые все одного размера Это не делает Array «не значением типа», потому что весь массив все еще копируется, когда вы переназначаете переменные типа [Any]. Другая, возможно, более убедительная причина заключается в том, что все значение массива все еще сохраняется в arr. Просто куча указателей на элементы. Если бы Array действительно был ссылочным типом, arr сохранял бы один указатель, указывающий на значение массива.

0 голосов
/ 08 января 2020

Массивы хранятся последовательно в блоках внутри памяти, поэтому с индексом это вычисление, которое имеет значение O (2) , которое относится к указателю на фактическое содержимое данных, скорее всего, только с Any, где размер каждого элемент отличается

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...