Во многом похожи на классы другие конструкции - структуры. Все базовые типы данных, такие как 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.
Еще одним отличием структуры от классов является невозможность изменения в методах структуры свойств этой же структуры. Например:
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())