Подсчет ссылок Swift Struct

У меня есть вопрос о структуре

В WWDC2016 сеанс рекомендует использовать sturct (тип значения)

но если в структурах есть еще 3 встроенных переменных слова, структура должна управлять счетчиком ссылок как большим значением в куче

тогда мой вопрос
когда у структуры есть 3 другой структуры, и у каждой структуры есть 2 или 3 другой тип структуры или значения

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

ниже приведен пример структур

struct ViewModel {
     var titleModel: TitleModel
     var contentModel: ContentModel
     var layoutModel: LayoutModel
}

struct TitleModel {
     var text: String
     var width: Float
     var height: Float
}

struct ContentModel {
     var content: String
     var width: Float
     var height: Float
}

struct LayoutModel {
     var constant: Float
     var multiply: Float
}

2 ответа

Решение

Структуры и перечисления имеют семантику значений. Не существует понятия количества ссылок, потому что они передаются путем копирования. Их члены могут быть указателями на ссылочные типы, но сам указатель копируется. Пока у вас нет ссылочного типа в структуре, вам не нужно беспокоиться о подсчете ссылок.

Конечно, можно утверждать, что Swift внутренне использует оптимизации копирования при записи, используя ссылочные типы, замаскированные под структуры (например, Array, Dictionary и т.д.), но они реализуют семантику значения.

Посмотрите эти числа размеров ваших структур.

print(sizeof(ViewModel))     //->72 == sizeof(TitleModel) + sizeof(ContentModel) + sizeof(LayoutModel)
print(sizeof(TitleModel))    //->32 == sizeof(String) + sizeof(Float) + sizeof(Float)
print(sizeof(ContentModel))  //->32 == sizeof(String) + sizeof(Float) + sizeof(Float)
print(sizeof(String))        //->24 (a mystery...)
print(sizeof(LayoutModel))   //->8 == sizeof(Float) + sizeof(Float)

(sizeof(String) кажется "загадкой", но это также другая проблема.)

Swift не дает нам никаких гарантий относительно распределения элементов в структуре, но, на данный момент, Swift распределяет все элементы способом "плоский и естественный".

 ViewModel:
 offset content                 size
  0     TitleModel.text          24
 24     TitleModel.width          4
 28     TitleModel.heigth         4
 32     ContentModel.content     24
 56     ContentModel.width        4
 60     ContentModel.height       4
 64     LayoutModel.constant      4
 68     LayoutModel.multiply      4
 --
 72     Total(=sizeof(ViewModel))

Ваш ViewModel не содержит ссылок на своих членов. Он просто держит своих членов внутри. Нет ссылок, так что нет ссылок.

У вас может возникнуть вопрос о том, как управляются структуры, когда они действительно содержат некоторые ссылки. Но это другая проблема, чем ваша when struct have 3 another struct and each struct have 2 or 3 another struct or value type,

Другие вопросы по тегам