Do livro da Apple "Uma das diferenças mais importantes entre estruturas e classes é que as estruturas são sempre copiadas quando transmitidas em seu código, mas as classes são transmitidas por referência".
Alguém pode me ajudar a entender o que isso significa? Para mim, classes e estruturas parecem ser as mesmas.
void my_func(int a)
vsvoid my_func(int &a)
. Esta é uma questão muito fundamental de programação. Leia mais: stackoverflow.com/questions/373419/…Respostas:
Aqui está um exemplo com a
class
. Observe como quando o nome é alterado, a instância referenciada pelas duas variáveis é atualizada.Bob
está agoraSue
, em todo lugar queBob
já foi referenciado.E agora, com a
struct
, vemos que os valores são copiados e cada variável mantém seu próprio conjunto de valores. Quando definimos o nome comoSue
, aBob
estruturaaStruct
não é alterada.Portanto, para representar uma entidade complexa com estado, a
class
é impressionante. Porém, para valores que são simplesmente uma medida ou bits de dados relacionados,struct
faz mais sentido que você possa copiá-los facilmente e calculá-los com eles ou modificar os valores sem medo de efeitos colaterais.fonte
aStruct and bStruct are two structs with the same value!
isso me confunde, pois os valores das variáveis dentro da estrutura são diferentes.aStruct
ebStruct
valores idênticos. Ambos têm um úniconame
campo que é definido como"Bob"
. Mas são duas estruturas diferentes. Isso é comprovado na próxima linha quando você pode alterar o nome de uma das estruturas e a outra permanece inalterada.Tanto a classe quanto a estrutura podem fazer:
Somente a classe pode fazer:
fonte
struct
são tipos de valor. Isso significa que, se você copiar a instância da estrutura para outra variável, ela será copiada para a variável.Exemplo para o tipo de valor
Classes são tipos de referência. Isso significa que, se você atribuir uma instância da classe a uma variável, ela conterá apenas a referência à instância e não a cópia .
fonte
As respostas acima estão corretas. Espero que minha resposta ajude alguém que não entende as respostas acima.
Bem no Swift Existem dois tipos de objetos
A principal diferença entre eles é
Por exemplo, aqui código para entender bem.
Essa foi a principal diferença, mas também temos sub diferenças.
Classe
Struct
fonte
Essa pergunta parece estar duplicada, mas, independentemente disso, o seguinte responderia à maioria dos casos de uso:
Uma das diferenças mais importantes entre estruturas e classes é que as estruturas são tipos de valor e sempre são copiadas quando transmitidas em seu código, e as classes são do tipo referência e são transmitidas por referência.
Além disso, as classes possuem herança, o que permite que uma classe herde as características de outra.
As propriedades de estrutura são armazenadas nas instâncias de pilha e classe, portanto, às vezes a pilha é drasticamente mais rápida que uma classe.
O Struct obtém um inicializador padrão automaticamente, enquanto que na classe precisamos inicializar.
Struct é thread thread safe ou singleton a qualquer momento.
E também, para resumir a diferença entre estruturas e classes, é necessário entender a diferença entre os tipos de valor e referência.
// sampleplayground.playground
Resultado:
fonte
Se você olhar mais longe no manual da apple, verá esta seção: “Estruturas e enumerações são tipos de valor”
Nesta seção, você verá o seguinte:
Essa é a maior diferença entre estruturas e classes. As estruturas são copiadas e as classes são referenciadas.
fonte
Geralmente (na maioria das linguagens de programação), os objetos são blocos de dados armazenados na pilha e, em seguida, uma referência (normalmente um ponteiro) a esses blocos contém um
name
está sendo usado para acessar esses blocos de dados. Esse mecanismo permite o compartilhamento de objetos na pilha, copiando o valor de suas referências (ponteiros). Esse não é o caso de tipos de dados básicos, como Inteiros, e isso ocorre porque a memória necessária para criar uma referência é quase a mesma que o objeto (nesse caso, valor inteiro). Assim, eles serão passados como valores e não como referência no caso de objetos grandes.Swift usa struct para melhorar o desempenho, mesmo com objetos String e Array.
Uma leitura muito boa aqui
fonte
Para entender a diferença entre estruturas e classes, precisamos conhecer a principal diferença entre os tipos de valor e referência. Estruturas são tipos de valor e isso significa que todas as alterações nelas apenas modificarão esse valor, Classes são tipos de referência e todas as alterações em um tipo de referência modificarão o valor alocado naquele local de memória ou referência. Por exemplo:
Vamos começar com uma classe, essa classe está em conformidade com o Equatable apenas para poder comparar instâncias, criamos uma instância chamada
pointClassInstanceA
e outra chamamos apointClassInstanceB
classe A à classe B, agora a asserção diz que são iguais ...Ok, o que aconteceu aqui, por que, se apenas mudássemos o valor x de pointsClassInstanceB, ele também alteraria o valor x de pointClassInstanceA? bem, isso mostra como os tipos de referência funcionam, quando atribuímos a instância A como um valor da instância B e, em seguida, modificamos X de um deles, ele altera os dois Xs porque eles compartilham a mesma referência e o que mudou foi o valor dessa referência.
Vamos fazer o mesmo, mas com uma estrutura
Temos basicamente a mesma estrutura da nossa classe, mas agora você pode ver que, quando você imprime o valor x de pointStructInstanceA, neste caso, isso não mudou, e isso ocorre porque os tipos de valor funcionam de maneira diferente e todas as alterações em uma de suas instâncias serão " independente "e não afetará o outro.
Swift sugere usar mais tipos de valor e você pode dizer que suas bibliotecas são baseadas em estruturas para evitar os problemas que os tipos de referência trazem, como modificar acidentalmente um valor etc. Estruturas são o caminho a seguir no Swift. Espero que ajude.
fonte
Aqui está um exemplo que mostra a diferença entre struct e classe com precisão.
captura de tela do código escrito no playground
fonte
fonte
Tipos rápidos
Valor Tipo :
Struct
,Enum
,Tuple
struct String
,struct Array
(Set
,Dictionary
)value type
uma nova cópia dos dados, é criada. Na verdade, o mecanismocopy on write
-COW
é usado com algumas otimizações, por exemplo, a cópia é criada quando o objeto é modificadoTipo de referência :
Class
,Function
reference type
uma nova referência à instância original, é criada (o endereço da instância é copiado).Value type
é recomendável usar por padrão . A maior vantagemValue type
é que geralmente eles sãothread safe
Reference type
Prós:deinit()
pode ser usado,===
,Objective-C
interoperabilidade porqueValue Type
foi introduzida no Swift.[Mais sobre mutabilidade]
Escolhendo entre
tipos de estruturas e classes
Classes e estruturas
fonte
Já há muito escrito sobre isso, eu gostaria de adicionar uma analogia lá. Espero que você nunca tenha dúvidas em mente depois disso: Conclusão: as classes são passadas por referência, enquanto as estruturas são passadas por valor.
Suponha que você esteja compartilhando uma folha de documentos do Google com seu amigo. Agora, se ele mudar alguma coisa, você também verá que as alterações no seu documento do Google significam que sua cópia também é afetada. Isso é basicamente " passado por referência ".
Mas suponha que, se você tiver um arquivo .XLS salvo em sua máquina. Você fornece esse arquivo para seu amigo. Agora, se ele estiver fazendo alguma alteração nesse arquivo, seu arquivo não será bagunçado / afetado porque você tem sua própria cópia. Isso é basicamente " passado por valor ". Você já tem vários programas simples para verificar essa analogia em playgrounds rápidos.
fonte