Структуры
Во многом похожи на классы другие конструкции - структуры. Все базовые типы данных, такие как Int, массивы, коллекции - все они представляют структурами.
Для определения структуры используется ключевое слово struct, после которого идет название структуры:
1
2
3
struct User {
}
В данном случае структура называется User. Как и класс, структура по сути представляет новый тип данных. Все тело структуры заключается в фигурные скобки.
Для создания объекта User нам надо использовать инициализатор по умолчанию:
1
var tom: User = User()
Структура, как и класс, может содержать свойства и методы:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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())
Одним из отличий структур от классов состоит в том, что для создания структур мы можем в инициализатор передать значения для всех его свойств:
1
2
var bob = User(name: "Bob", age: 23)
print(bob.getInfo())
При этом не важно, что в самой структуре нет инициализатора, который принимает два параметра. По умолчанию для каждой структуры мы можем передать в инициализаторе значения для всех ее свойств. Параметры инициализатора в этом случае соответствуют свойствам структуры. При этом мы не можем задать только одно или два свойства, нам обязательно надо указать значения для всех свойств структуры.
Но мы также можем задать и дополнительные инициализаторы в самой структуре:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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-методы
Еще одним отличием структуры от классов является невозможность изменения в методах структуры свойств этой же структуры. Например:
1
2
3
4
5
6
7
8
9
10
11
12
13
struct User {
var name: String
var age: Int
func getInfo() -> String{
return "Имя: \( name). Возраст: \(age)"
}
func setName(name: String){
self.name = name
}
}
Чтобы выйти из этой ситуации, перед именем метода необходимо указать ключевое слово mutating:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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())