Eu posso ver essas definições na biblioteca Swift:
extension Bool : BooleanLiteralConvertible {
static func convertFromBooleanLiteral(value: Bool) -> Bool
}
protocol BooleanLiteralConvertible {
typealias BooleanLiteralType
class func convertFromBooleanLiteral(value: BooleanLiteralType) -> Self
}
Qual é a diferença entre uma função membro definida como static func
e outra definida como class func
? Simplesmente static
é para funções estáticas de estruturas e enumerações, e class
para classes e protocolos? Existem outras diferenças que alguém deva conhecer? Qual é a justificativa para ter essa distinção na própria sintaxe?
class func
? Com as informações que temos agora, essa distinção parece bastante inútil, não é?class func
serror: class methods are only allowed within classes; use 'static' to declare a static method
Respostas:
Essa é a principal diferença. Algumas outras diferenças são que as funções de classe são despachadas dinamicamente e podem ser substituídas por subclasses.
Os protocolos usam a palavra-chave class, mas não exclui estruturas da implementação do protocolo, apenas usam estática. A classe foi escolhida para protocolos, para que não houvesse uma terceira palavra-chave para representar estática ou classe.
De Chris Lattner sobre este tópico:
E aqui está um trecho que mostra alguns dos comportamentos de substituição das funções de classe:
fonte
static func myFunc()
vez declass func myFunc
, receberá o seguinte erro l: não é possível substituir o método estático . Por quê? Porque é como se tivesse sido marcado comfinal
. Para maiores informações. Veja a resposta do nextD abaixo. Tambémx.dynamicType
agora foi substituído portype(of:x)
Para ser mais claro, eu faço um exemplo aqui,
static func
é o mesmo quefinal class func
Porque é
final
, não podemos substituí-lo na subclasse como abaixo:fonte
class func
é diferente do normal,func
embora ambos possam ser substituídos. Masfunc
é para uma instância / objeto eclass func
pode ser acessado através da classe comoClassA.classFunc()
Fiz algumas experiências no parquinho e tirei algumas conclusões.
TL; DR
Como você pode ver, no caso de
class
, o usoclass func
oustatic func
é apenas uma questão de hábito.Exemplo de playground com explicação:
fonte
class
funções vs. vinculação estática de umstatic
.class func
substituível?class func
é substituível. Eu teria votado nisso de outra maneira; ame a pesquisa e o exemplo!Fonte: A linguagem de programação Swift - Propriedades da variável de tipo
fonte
De acordo com o Swift 2.2 Book publicado pela apple:
“Você indica métodos de texto escrevendo a
static
palavra - chave antes da palavra-chave func do método. As classes também podem usar aclass
palavra - chave para permitir que as subclasses substituam a implementação desse método pela superclasse . ”fonte
A partir do Swift2.0, a Apple diz:
"Sempre prefixe os requisitos de propriedade de tipo com a palavra-chave estática quando você os definir em um protocolo. Esta regra se aplica mesmo que os requisitos de propriedade de tipo possam ser prefixados com a classe ou a palavra-chave estática quando implementada por uma classe:"
fonte
Este exemplo irá limpar todos os aspectos!
Resultado:
fonte
Isso é chamado de métodos de tipo e é chamado com sintaxe de ponto, como métodos de instância. No entanto, você chama métodos de tipo no tipo, não em uma instância desse tipo. Veja como você chama um método de tipo em uma classe chamada SomeClass:
fonte
static
eclass
palavras - chave.