Структуры

Последнее обновление: 02.01.2017

Во многом похожи на классы другие конструкции - структуры. Все базовые типы данных, такие как Int, массивы, коллекции - все они представляют структурами.

Для определения структуры используется ключевое слово struct, после которого идет название структуры:

struct User {

}

В данном случае структура называется User. Как и класс, структура по сути представляет новый тип данных. Все тело структуры заключается в фигурные скобки.

Для создания объекта User нам надо использовать инициализатор по умолчанию:

var tom: User = User()

Структура, как и класс, может содержать свойства и методы:

struct User {
    var name: String = "Tom"
    var age: Int = 18
    
    func getInfo() -> String{
    
        return "Имя: \( name). Возраст: \(age)"
    }
}
var tom: User = User()
print(tom.getInfo())    // Имя: Tom. Возраст: 18

var bob  = User()
bob.name = "Bob"
bob.age = 23
print(bob.getInfo())

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

var bob  = User(name: "Bob", age: 23)
print(bob.getInfo())

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

Но мы также можем задать и дополнительные инициализаторы в самой структуре:

struct User {
    var name: String
    var age: Int
    
    init(name: String){
        
        self.init(name: name, age: 15)
    }
    init(name: String, age: Int){
        
        self.name = name
        self.age = age
    }
    
    func getInfo() -> String{
    
        return "Имя: \( name). Возраст: \(age)"
    }
}
var tom: User = User(name: "Tom")
print(tom.getInfo())    // Имя: Tom. Возраст: 15

var bob  = User(name: "Bob", age: 23)
print(bob.getInfo())

Для обращения к свойствам, методам, инициализаторам структуры, также как и в классе, может использоваться ключевое слово self.

mutating-методы

Еще одним отличием структуры от классов является невозможность изменения в методах структуры свойств этой же структуры. Например:

struct User {
    var name: String
    var age: Int
    
    func getInfo() -> String{
    
        return "Имя: \( name). Возраст: \(age)"
    }
    
    func setName(name: String){
        self.name = name
    }
}

Чтобы выйти из этой ситуации, перед именем метода необходимо указать ключевое слово mutating:

struct User {
    var name: String
    var age: Int
    
    func getInfo() -> String{
    
        return "Имя: \( name). Возраст: \(age)"
    }
    
    mutating func setName(name: String){
        self.name = name
    }
}

var bob  = User(name: "Bob", age: 23)
bob.setName(name: "Robert")
print(bob.getInfo())
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850