Estou escrevendo um aplicativo que recebe dados com itens e números de versão. Os números são formatados como "1.0.1" ou "1.2.5". Como posso comparar esses números de versão? Eu acho que eles têm que ser formatados como string primeiro, não? Que opções tenho para determinar que "1.2.5" vem depois de "1.0.1"?
objective-c
comparison
mlecho
fonte
fonte
Respostas:
Esta é a maneira mais simples de comparar versões, tendo em mente que "1" <"1.0" <"1.0.0":
fonte
componentsSeparatedByString
abordagem). Você mesmo pode testar isso com@"1.8"
vs@"1.7.2.3.55"
e ver que 1.8 sai na frente.Adicionarei meu método, que compara versões estritamente numéricas (não a, b, RC etc.) com qualquer número de componentes.
fonte
Esta é uma expansão da resposta de Nathan de Vries para resolver o problema de 1 <1,0 <1,0,0 etc.
Em primeiro lugar, podemos resolver o problema de ".0" extras em nossa string de versão com uma
NSString
categoria:Com a
NSString
categoria acima , podemos encurtar nossos números de versão para eliminar os .0s desnecessáriosAgora ainda podemos usar a abordagem lindamente simples proposta por Nathan de Vries:
fonte
Eu mesmo fiz, uso categoria ..
Fonte..
Teste..
fonte
Sparkle (a estrutura de atualização de software mais popular para MacOS) tem uma classe SUStandardVersionComparator que faz isso e também leva em consideração números de compilação e marcadores beta.
1.0.5 > 1.0.5b7
Ou seja, compara corretamente ou2.0 (2345) > 2.0 (2100)
. O código usa apenas Foundation, então deve funcionar bem no iOS também.fonte
Confira minha categoria NSString que implementa verificação de versão fácil no github; https://github.com/stijnster/NSString-compareToVersion
Isso retornará um NSComparisonResult que é mais preciso do que usar;
Ajudantes também são adicionados;
fonte
Versão do Swift 2.2:
Versão Swift 3:
fonte
fonte
Pensei em compartilhar uma função que reuni para isso. Não é nada perfeito. Veja os exemplos e resultados. Mas se você estiver verificando seus próprios números de versão (o que tenho que fazer para gerenciar coisas como migrações de banco de dados), isso pode ajudar um pouco.
(também, remova as declarações de log do método, é claro. Elas estão lá para ajudá-lo a ver o que faz, é tudo)
Testes:
Resultados:
observe que o alfa funciona, mas você deve ter muito cuidado com ele. uma vez que você vá para alfa em algum ponto, você não pode estender isso alterando quaisquer outros números menores por trás dele.
Código:
fonte
Minha biblioteca iOS AppUpdateTracker contém uma categoria NSString para realizar esse tipo de comparação. (A implementação é baseada na resposta de DonnaLea .)
O uso seria o seguinte:
Além disso, você pode usá-lo para controlar o status de instalação / atualização do seu aplicativo:
fonte
Glibc tem uma função
strverscmp
eversionsort
... infelizmente, não é portátil para o iPhone, mas você pode escrever a sua com bastante facilidade. Esta reimplementação (não testada) vem apenas da leitura do comportamento documentado, e não da leitura do código-fonte do Glibc.fonte
Se você souber que cada número de versão terá exatamente 3 inteiros separados por pontos, você pode analisá-los (por exemplo, usando
sscanf(3)
) e compará-los:fonte
Para verificar a versão rapidamente, você pode usar o seguinte
Espero que possa ser útil.
fonte
Aqui está uma função recursiva que faz o trabalho com a formatação de várias versões de qualquer comprimento. Também funciona para @ "1.0" e @ "1.0.0"
Amostras de teste:
fonte