Eu tenho essas definições em minha função que funcionam
class MyClass {
func myFunc() {
let testStr = "test"
let testStrLen = countElements(testStr)
}
}
Mas se eu mover 'testStr' e 'testStrLen' para o nível de classe, ele não compilará. Dizia que 'MyClass.Type não tem um membro chamado' testStr '.
class MyClass {
let testStr = "test"
let testStrLen = countElements(testStr)
func myFunc() {
}
}
Como posso consertar isso? Eu não quero pagar a penalidade por contar muito tempo de um 'teste' constante todas as vezes.
Com base no meu entendimento dos comentários abaixo, preciso fazer o seguinte:
class MyClass {
let testStr = "test"
let testStrLen = countElements("test")
func myFunc() {
}
}
Existe uma maneira de eu não precisar digitar / entrar em "teste" duas vezes? Obrigado.
Respostas:
Talvez um bom idioma para declarar constantes para uma classe em Swift seja apenas usar uma estrutura chamada MyClassConstants como a seguir.
Desta forma, suas constantes terão o escopo definido em uma construção declarada em vez de flutuar globalmente.
Atualizar
Eu adicionei uma constante de array estático, em resposta a um comentário perguntando sobre a inicialização de array estático. Veja os literais de array em "The Swift Programming Language".
Observe que tanto os literais de string quanto a constante de string podem ser usados para inicializar o array. No entanto, como o tipo de array é conhecido, a constante inteira
testStrLength
não pode ser usada no inicializador de array.fonte
static
constantes emStruct
e emClass
es?MyClassConstants.testStr.rawValue
acessar o valor, o que não é tão sintaticamente amigável quanto justoMyClassConstants.testStr
.Adicionando à resposta de @Martin ...
Se alguém planeja manter um arquivo constante de nível de aplicativo, você pode agrupar a constante com base em seu tipo ou natureza
Ligar :
Constants.MixpanelConstants.activeScreen
ATUALIZAÇÃO 5/5/2019 (meio fora do tópico, mas 🤷🏽♂️)
Depois de ler algumas diretrizes de código e de experiências pessoais, parece que as estruturas não são a melhor abordagem para armazenar constantes globais por alguns motivos. Especialmente o código acima não impede a inicialização da estrutura. Podemos conseguir isso adicionando algum código clichê, mas há uma abordagem melhor
ENUMS
O mesmo pode ser alcançado usando um enum com uma representação mais segura e clara
fonte
Se eu entendi sua pergunta corretamente, você está perguntando como você pode criar constantes de nível de classe (estáticas - no jargão C ++) de forma que você não a) replique a sobrecarga em todas as instâncias eb tenha que recalcular o que de outra forma é constante.
A linguagem evoluiu - como todo leitor sabe, mas ao testar isso no Xcode 6.3.1, a solução é:
Não sei se a estática é estritamente necessária, pois o compilador certamente adiciona apenas uma entrada por variável const na seção estática do binário, mas isso afeta a sintaxe e o acesso. Usando estático, você pode se referir a ele mesmo quando você não tem uma instância:
MyClass.testStrLen
.fonte
Se você realmente deseja uma propriedade estática de sua classe, isso não é atualmente suportado no Swift. O conselho atual é contornar isso usando constantes globais:
Se você quiser que essas propriedades sejam de instância, em vez disso, você pode usar uma propriedade lazy stored para o comprimento - ela só será avaliada na primeira vez que for acessada, portanto, você não a computará continuamente.
fonte
Que tal usar propriedades computadas?
fonte
Alguns podem querer certas constantes de classe públicas, enquanto outras, privadas.
A palavra-chave privada pode ser usada para limitar o escopo das constantes no mesmo arquivo swift.
Outras classes serão capazes de acessar suas constantes de classe como abaixo
fonte
Julgado no Playground
fonte