O código a seguir é compilado no Swift 1.2:
class myClass {
static func myMethod1() {
}
class func myMethod2() {
}
static var myVar1 = ""
}
func doSomething() {
myClass.myMethod1()
myClass.myMethod2()
myClass.myVar1 = "abc"
}
Qual é a diferença entre uma função estática e uma função de classe ? Qual devo usar e quando?
Se eu tentar definir outra variável class var myVar2 = ""
, ele diz:
Propriedades armazenadas de classe ainda não suportadas em classes; você quis dizer 'estático'?
Quando esse recurso é suportado, qual será a diferença entre uma variável estática e uma variável de classe (ou seja, quando ambas são definidas em uma classe)? Qual devo usar e quando?
(Xcode 6.3)
Respostas:
static
eclass
ambos associam um método a uma classe, em vez de uma instância de uma classe. A diferença é que as subclasses podem substituir osclass
métodos; eles não podem substituirstatic
métodos.class
teoricamente, as propriedades funcionarão da mesma maneira (as subclasses podem substituí-las), mas ainda não são possíveis no Swift.fonte
final class
função e função 'estática' dentro de uma classe?final
pode ser usado para eliminar substituições adicionais quando usado em uma subclasse. Os dois têm o seu lugar, eu diria que o usostatic
oufinal
quando usado em uma função de classe é trivial e depende da sua escolha de estilo.static func foo(){}
no Swift é comopublic static final foo(){}
em Java?Eu tentei a resposta de mipadi e comentários no playground. E pensou em compartilhá-lo. Aqui está. Acho que a resposta de mipadi deve ser considerada aceita.
fonte
Em relação ao POO , a resposta é muito simples:
As subclasses podem substituir métodos de classe , mas não podem substituir métodos estáticos .
Além da sua postagem, se você quiser declarar uma variável de classe (como você fez
class var myVar2 = ""
), faça o seguinte:fonte
Eu também peguei essa confusão em um dos meus projetos e achei este post muito útil. Tentei o mesmo no meu playground e aqui está o resumo. Espero que isso ajude alguém com propriedades e funções do tipo armazenados
static
,final
,class
, classe substituindo vars etc.E aqui estão as amostras de teste:
fonte
Os testes no Swift 4 mostram a diferença de desempenho no simulador. Eu fiz uma classe com "class func" e struct com "static static" e as executei no teste.
func estático é:
No entanto, a execução do mesmo código no iPhone 7 no iOS 10.3 mostra exatamente o mesmo desempenho.
Aqui está um exemplo de projeto no Swift 4 para Xcode 9, se você quiser se testar https://github.com/protyagov/StructVsClassPerformance
fonte
Há mais uma diferença.
class
pode ser usado para definir apenas propriedades de tipo computado . Se você precisar de uma propriedade de tipo armazenado, usestatic
."Você define propriedades de tipo com a palavra-chave estática. Para propriedades de tipo computadas para tipos de classe, você pode usar a palavra-chave de classe para permitir que as subclasses substituam a implementação da superclasse."
fonte
Adicionar as respostas acima aos métodos estáticos é despacho estático significa que o compilador sabe qual método será executado em tempo de execução, pois o método estático não pode ser substituído, enquanto o método da classe pode ser um despacho dinâmico, pois a subclasse pode substituí-los.
fonte
Há mais uma diferença. A classe pode ser usada para definir somente propriedades de tipo computado. Se você precisar de uma propriedade de tipo armazenado, use static.
Classe: - tipo de referência
struct: - tipo de valor
fonte
class
é usado dentroReference Type
(classe):static
é usado dentroReference Type
eValue Type
(classe, enum):[Referência versus tipo de valor]
fonte