English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Estruturas Swift

As estruturas Swift são uma construção genérica e flexível usada para construir código.

Podemos definir atributos (constantes, variáveis) e adicionar métodos para estruturas, expandindo suas funcionalidades.

Diferente de C e Objective-C:

  • As estruturas não precisam conter arquivos de implementação e interfaces.

  • As estruturas permitem que criemos um único arquivo e o sistema gere automaticamente interfaces externas para outro código.

As estruturas são sempre passadas por cópia no código, portanto, seu valor não pode ser modificado.

Sintaxe

Definimos a estrutura através da palavra-chave struct:

struct nameStruct { 
   Definição 1
   Definição 2
   ……
   Definição N
}

Exemplo online

Definimos uma estrutura chamada MarkStruct, cujos atributos são as notas de três disciplinas do aluno, do tipo Int:

struct MarkStruct{
   var mark1: Int
   var mark2: Int
   var mark3: Int
}

我们可以通过结构体名来访问结构体成员。

结构体示例化使用 let 关键字:

import Cocoa
struct studentMarks {
   var mark1 = 100
   var mark2 = 78
   var mark3 = 98
}
let marks = studentMarks()
print("Mark1 是 (marks.mark1)
print("Mark2 是 (marks.mark2)
print("Mark3 是 (marks.mark3)

O resultado da execução do programa acima é:

Mark1 是 100
Mark2 是 78
Mark3 是 98

示例中,我们通过结构体名 'studentMarks' 访问学生的成绩。结构体成员初始化为mark1, mark2, mark3,数据类型为整型。

然后我们通过使用 let 关键字将结构体 studentMarks()  示例化并传递给 marks。

最后我们就通过 号来访问结构体成员的值。

以下示例化通过结构体示例化时传值并克隆一个结构体:

import Cocoa
struct MarksStruct {
   var mark: Int
   init(mark: Int) {
      self.mark = mark
   }
}
var aStruct = MarksStruct(mark: 98)
var bStruct = aStruct // bStruct 和 aStruct 是使用相同值的结构体!
bStruct.mark = 97
print(aStruct.mark) // 98
print(bStruct.mark) // 97

O resultado da execução do programa acima é:

98
97

结构体应用

在你的代码中,你可以使用结构体来定义你的自定义数据类型。

结构体示例总是通过值传递来定义你的自定义数据类型。

按照通用的准则,当符合一条或多条以下条件时,请考虑构建结构体:

  • 结构体的主要目的是用来封装少量相关简单数据值。

  • 有理由预计一个结构体示例在赋值或传递时,封装的数据将会被拷贝而不是被引用。

  • 任何在结构体中储存的值类型属性,也将会被拷贝,而不是被引用。

  • 结构体不需要去继承另一个已存在类型的属性或者行为。

举例来说,以下情境中适合使用结构体:

  • 几何形状的大小,封装一个width属性和height属性,两者均为Double类型。

  • 一定范围内的路径,封装一个start属性和length属性,两者均为Int类型。

  • 三维坐标系内一点,封装xyz属性,三者均为Double类型。

结构体示例是通过值传递而不是通过引用传递。

import Cocoa
struct markStruct{}}
    var mark1: Int
    var mark2: Int
    var mark3: Int
    
    init(mark1: Int, mark2: Int, mark3: Int){
        self.mark1 = mark1
        self.mark2 = mark2
        self.mark3 = mark3
    }
}
print("Obter a pontuação alta:")
var marks = markStruct(mark1: 98, mark2: 96, mark3:100)
print(marks.mark1)
print(marks.mark2)
print(marks.mark3)
print("Obter a pontuação baixa:")
var fail = markStruct(mark1: 34, mark2: 42, mark3: 13)
print(fail.mark1)
print(fail.mark2)
print(fail.mark3)

O resultado da execução do programa acima é:

Obter a pontuação alta:
98
96
100
Obter a pontuação baixa:
34
42
13

Nos exemplos acima, definimos a estrutura  markStruct,três atributos de membro: mark1, mark2 e mark3A estrutura usa a palavra-chave self para os atributos de membro.

Podemos entender muito bem, a partir do exemplo, que o exemplo de estrutura de estrutura é passado por valor.