Swift Language
Структуры
Поиск…
Основы структур
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