Estou olhando para as notas do Xcode 7.3 e noto esse problema.
Os operadores ++ e - foram descontinuados
Alguém poderia explicar por que está obsoleto? E estou certo de que, na nova versão do Xcode, agora você vai usar em vez ++
disso x += 1
;
Exemplo:
for var index = 0; index < 3; index += 1 {
print("index is \(index)")
}
++
and--
Respostas:
Uma explicação completa aqui de Chris Lattner, criador de Swift. Vou resumir os pontos:
x += 1
for i = 0; i < n; i++ { ... }
:, que Swift tem melhores alternativas, comofor i in 0..<n { ... }
(o estilo C para loop também está saindo )x - ++x
oufoo(++x, x++)
?Para os interessados (e para evitar o apodrecimento do link), as razões de Lattner em suas próprias palavras são:
fonte
++
não existisse nas linguagens do estilo C, ninguém em sã consciência examinaria o design do Swift 3.0 e pensaria que um++
operador seria uma boa adição a ele.Sei que esse comentário não responde à pergunta, no entanto, pode haver pessoas procurando uma solução para manter esses operadores funcionando e essa solução pode ser encontrada na parte inferior. 😇
Eu pessoalmente prefiro
++
e--
operadores. Não posso concordar com a opinião de que eles são complicados ou difíceis de gerenciar. Depois que o desenvolvedor entender o que esses operadores fazem (e estamos falando de coisas bem simples), o código deve ficar bem claro.Na explicação de por que os operadores foram descontinuados, é mencionado que seu principal uso era no estilo C para loops. Eu não sei sobre os outros, mas eu pessoalmente não usar loops de estilo C em tudo e ainda há muitos outros lugares ou situações quando
++
ou--
operador é útil.Gostaria de mencionar também que
varName++
retorna um valor para que possa ser usado noreturn
whilevarName += 1
não pode.Para qualquer um de vocês que gostaria de manter esses operadores trabalhando aqui, é a solução:
fonte
return (x - 1)
para os operadores postfix - IMHO é que é mais limpo para manter a semântica que eles retornam (uma cópia) do valor original e não o que você ganha se você fazerx + 1 - 1
Int
apenas, o resultado de(x + 1)
será transbordado, o que interromperá a execução e, portantoresult - 1
, nem será executado. Outros tipos de dados, comoDouble
por exemplo, se comportam de maneira diferente, por isso preciso investigar isso.defer
para isso também.defer { x += 1 }; return x
A Apple removeu
++
e tornou muito mais simples com a outra velha maneira tradicional.Em vez de
++
, você precisa escrever+=
.Exemplo:
Da mesma forma para o operador de decremento
--
, você precisa escrever-=
Exemplo:
Para
for
loops:Exemplo de incremento:
Ao invés de
Você pode escrever:
Exemplo de Decremento:
Você pode escrever:
Espero que isto ajude!
fonte
+=
estava lá o tempo todo.++i
e--i
?Chris Lattner entrou em guerra contra ++ e -. Ele escreve: “O código que realmente usa o valor resultante desses operadores geralmente é confuso e sutil para um leitor / mantenedor de código. Eles incentivam códigos "excessivamente complicados", que podem ser engraçados, mas difíceis de entender ... Embora o Swift tenha uma ordem de avaliação bem definida, qualquer código que dependesse dele (como foo (++ a, a ++)) seria indesejável, mesmo que foi bem definido ... eles falham na métrica de "se ainda não os tivéssemos, os adicionaríamos ao Swift 3?"
A Apple queria manter rápida uma linguagem limpa, clara, não confusa e direta ao ponto. E então eles preteriram ++ e - palavra-chave.
fonte
...for i in 0.stride(to: 10, by: 2)...
ou...for i in (1...10).reverse()...
está limpo ?!O
Fix-it feature
do Xcode dá uma resposta clara para isso.Substitua
++ increment operator
por antiquadovalue += 1
(operador de mão curta) e-- decrement operator
porvalue -= 1
fonte
Para o Swift 4, você pode restaurar os operadores
++
e--
como extensões paraInt
e outros tipos. Aqui está um exemplo:Ele funciona da mesma maneira para outros tipos, tais como
UIInt
,Int8
,Float
,Double
, etc.Você pode colar essas extensões em um único arquivo no diretório raiz e elas estarão disponíveis para uso em todos os seus outros arquivos lá.
Percebi alguns votos negativos para a minha resposta aqui, quase assim que a publiquei. O que considero um desacordo filosófico, em vez de uma crítica de como meu código funciona. Funciona perfeitamente, se você der uma olhada em um playground.
A razão pela qual publiquei esta resposta é porque discordo de tornar as linguagens de programação de computador desnecessariamente diferentes uma da outra.
Ter muitas semelhanças entre idiomas facilita a aprendizagem e a troca de um idioma para outro.
Os desenvolvedores normalmente usam várias linguagens de programação, em vez de apenas uma. E é um verdadeiro aborrecimento mudar de um idioma para outro, quando não há convenções nem padronização comum entre os idiomas.
Acredito que deve haver diferenças de sintaxe entre os idiomas apenas o necessário e não mais do que isso.
fonte
Aqui está uma versão genérica de alguns dos códigos publicados até o momento. Eu expressaria as mesmas preocupações que os outros: é uma prática recomendada não usá-las no Swift. Concordo que isso pode ser confuso para quem ler seu código no futuro.
Isso também pode ser escrito como uma extensão no tipo numérico.
fonte
@discardableResult
a cada uma dessas funções para silenciar o aviso sobre o valor de retorno não estar sendo usado; caso contrário, exatamente o que eu estava procurando.Dos documentos :
fonte
Esta é definitivamente uma desvantagem, certo?
fonte
Como você nunca trabalha com ponteiros no Swift, faz sentido remover os operadores
++
e--
na minha opinião. No entanto, se você não pode viver sem, você pode adicionar estas declarações do operador Swift 5+ ao seu projeto:fonte
No Swift 4.1, isso pode ser alcançado da seguinte maneira:
Observe que, apesar do fato de que esta solução é semelhante às soluções anteriores deste post, elas não funcionam mais no Swift 4.1 e este exemplo funciona. Observe também que quem menciona acima que + = é um substituto para ++ simplesmente não entende completamente o operador, pois ++ combinado com a atribuição é na verdade duas operações, portanto, um atalho. No meu exemplo:
var s = t++
faz duas coisas: atribua o valor de t a se incremente t. Se o ++ vier antes, são as mesmas duas operações feitas em ordem inversa. Na minha opinião, o raciocínio da Apple sobre o motivo de remover esse operador (mencionado nas respostas anteriores) não é apenas um raciocínio falso, mas além disso acredito que é uma mentira e o verdadeiro motivo é que eles não conseguiram fazer com que o compilador lidasse com isso. Isso deu a eles problemas nas versões anteriores, então eles desistiram. A lógica do "operador muito complicado de entender, portanto removido" é obviamente uma mentira porque o Swift contém operadores muito mais complicados e muito menos úteis que não foram removidos. Além disso, a grande maioria das linguagens de programação possui. JavaScript, C, C #, Java, C ++ e muito mais. Os programadores o usam alegremente. Para quem é muito difícil entender esse operador,A estratégia por trás do Swift é simples: a Apple acredita que o programador é burro e, portanto, deve ser tratado de acordo.
A verdade é que o Swift, lançado em setembro de 2014, deveria estar em outro lugar até agora. Outras línguas cresceram muito mais rapidamente.
Posso listar muitos erros importantes na linguagem, desde os graves: como arrays colados por valor e não por referência, até os irritantes: funções de parâmetros variados não podem aceitar um array, que é a idéia por trás dele. Não acho que os funcionários da Apple tenham permissão para procurar outras linguagens como Java, para que nem saibam que a Apple está anos-luz atrás. A Apple poderia ter adotado o Java como uma linguagem, mas atualmente, o desafio não é a tecnologia, mas o ego. Se eles tivessem aberto o IntelliJ para escrever um pouco de Java, certamente fechariam seus negócios, entendendo que, neste momento, eles não podem e nunca vão se atualizar.
fonte