Поиск…


Основы структур

struct Repository {
    let identifier: Int
    let name: String
    var description: String?
}

Это определяет структуру Repository с тремя хранимыми свойствами, целочисленным identifier , строковым name и необязательным description строки. identifier и name являются константами, так как они были объявлены с помощью let -keyword. После установки во время инициализации они не могут быть изменены. Описание - это переменная. Изменение этого параметра изменяет значение структуры.

Типы структуры автоматически получают членский инициализатор, если они не определяют никаких собственных собственных инициализаторов. Структура получает член-инициализатор, даже если он сохранил свойства, которые не имеют значений по умолчанию.

Repository содержит три хранимых свойства, для которых только description имеет значение по умолчанию ( nil ). Далее он не определяет никаких собственных инициализаторов, поэтому он бесплатно получает инициализатор по порядку:

let newRepository = Repository(identifier: 0, name: "New Repository", description: "Brand New Repository")

Структуры являются типами значений

В отличие от классов, которые передаются по ссылке, структуры передаются путем копирования:

first = "Hello"
second = first
first += " World!"
// first == "Hello World!"
// second == "Hello"

Строка - это структура, поэтому она копируется при назначении.

Структуры также не могут сравниваться с использованием оператора идентичности:

window0 === window1 // works because a window is a class instance
"hello" === "hello" // error: binary operator '===' cannot be applied to two 'String' operands

Каждые два экземпляра структуры считаются идентичными, если сравнивать их равными.

В совокупности эти черты, которые различают структуры из классов, являются тем, что делает типы ценностей структур.

Мутирование структуры

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

struct Counter {
    private var value = 0
    
    mutating func next() {
        value += 1
    }
}

Когда вы можете использовать мутирующие методы

Методы mutating доступны только для значений структуры внутри переменных.

var counter = Counter()
counter.next()

Если вы не можете использовать мутирующие методы

С другой стороны, mutating методы НЕ доступны по значениям структуры внутри констант

let counter = Counter()
counter.next()
//  error: cannot use mutating member on immutable value: 'counter' is a 'let' constant

Структуры не могут наследовать

В отличие от классов, структуры не могут наследовать:

class MyView: NSView { }  // works

struct MyInt: Int { } // error: inheritance from non-protocol type 'Int'

Однако структуры могут принимать протоколы:

struct Vector: Hashable { ... }  // works

Доступ к членам структуры

В Swift структуры используют простой «точечный синтаксис» для доступа к своим членам.

Например:

struct DeliveryRange {
  var range: Double
  let center: Location
}
let storeLocation = Location(latitude: 44.9871,
                             longitude: -93.2758)
var pizzaRange = DeliveryRange(range: 200,
                               center: storeLocation)

Вы можете получить доступ (распечатать) диапазон следующим образом:

    print(pizzaRange.range) // 200

Вы даже можете получить доступ к членам членов, используя точечный синтаксис:

 print(pizzaRange.center.latitude) // 44.9871

Подобно тому, как вы можете читать значения с синтаксисом точек, вы также можете назначить их.

pizzaRange.range = 250


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow