Fóruns

O operador Mac Binary '>' não pode ser aplicado a operandos do tipo 'Double?' e 'Int'

abcdefg12345

Pôster original
10 de julho de 2013
  • 21 de outubro de 2017
Estou tentando ter uma instrução if para verificar se um valor double em uma string é maior que 10, mas estou interessado em obter um erro 'Operador binário'> 'não pode ser aplicado a operandos do tipo' Double? ' e 'Int' 'alguém sabe o que estou fazendo de errado.

rápido 4
Código: if (Double(MyValue) > 10) { // value is bigger than 10 } else { // do something else }
estou usando uma string variável porque preciso que seja uma string para poder formatá-la mais tarde, eu a defini como
Código: var MyValue = ''

abcdefg12345

Pôster original
10 de julho de 2013


  • 21 de outubro de 2017
consertou adicionando outra variável
Código: let CheckValue = Double(MyValue)! if CheckValue > 10 { }
Reações:960design

0002378

Suspenso
28 de maio de 2017
  • 23 de outubro de 2017
Eu acho que o Swift, como uma linguagem, é bastante risível às vezes, esp. vindo da programação Java. E você trouxe um dos melhores exemplos disso.

E, embora os opcionais tenham seus benefícios, eles também me fazem querer quebrar meu computador contra as bordas superiores de uma lixeira.

No entanto, onde Swift realmente arrasa é no departamento de encerramentos ... ah, sim! Java também os tem, agora, mas ...

E, claro, o fato de Swift ser menos rigoroso na declaração de tipos e aqueles pontos-e-vírgulas irritantes ... incrível!

Reações:abcdefg12345

0002378

Suspenso
28 de maio de 2017
  • 24 de outubro de 2017
Oh, espere, agora que eu olho para trás em seu código, vejo que seu valor Double (string) é avaliado como Double ?, que é um valor opcional.

Você não precisa de uma nova variável. Você pode apenas adicionar '!' ao seu Double (string), e funcionará.

Acho que estava errado sobre Swift ser estúpido neste caso. Mas, eu encontrei muitos casos de reclamações do compilador (incapaz de comparar dois tipos numéricos diferentes).

Greene

15 de julho de 2015
Fort Worth
  • 24 de outubro de 2017
Acho que uma solução mais limpa e mais rápida seria armazenar seu MyValue como duplo ou int (o que parece ser). Você pode então usar um NumberFormatter para lidar com a formatação.

Ou você pode usar ligação opcional para desembrulhar o valor. Eu tentaria um desses métodos primeiro, antes de usar um desembrulhamento forçado

gnasher729

Suspenso
25 de novembro de 2005
  • 24 de outubro de 2017
maculateConception disse: Eu acho que o Swift, como linguagem, é bastante risível às vezes, esp. vindo da programação Java. E você trouxe um dos melhores exemplos disso.
Isso é totalmente sem noção. O problema é que o OP não conhece um recurso básico do Swift, que são os valores opcionais. O construtor Double (String) pode obviamente falhar se a String não contiver um número. É por isso que Double (String) não produz e não pode produzir um resultado do tipo Double, mas um do tipo Double? , que é um Double opcional. E um Double opcional não pode ser comparado com um Int.

Sua 'solução' é realmente terrível. O ! significa 'Tenho certeza de que essa conversão será bem-sucedida. Se isso não acontecer, bloqueie o aplicativo '. deixe d = Double ('1234x')! vai apenas falhar. Intencionalmente. Porque você não marcou nulo e foi nulo.

A maneira correta é verificar o erro. Por exemplo

se d = Double (MyValue), d> 10 {
// MeuValor continha um número e o número é> 10.
} outro {
// MeuValor não continha um número, ou o número era<= 10.
}

Se você acha que vale a pena escrever um código que seja seguro e realmente funcione, Swift é a linguagem certa.
Reações:atmenterprises e ajthom90

0002378

Suspenso
28 de maio de 2017
  • 24 de outubro de 2017
gnasher729 disse: Isso é completamente sem noção. O problema é que o OP não conhece um recurso básico do Swift, que são os valores opcionais. O construtor Double (String) pode obviamente falhar se a String não contiver um número. É por isso que Double (String) não produz e não pode produzir um resultado do tipo Double, mas um do tipo Double? , que é um Double opcional. E um Double opcional não pode ser comparado com um Int.

Você foi intimidado na escola? Você parece ter uma auto-estima bastante baixa porque não conseguia responder sem me atacar.

Esta será minha primeira e última comunicação com você. Sugestão para você - tente se comunicar de uma forma mais civilizada e a vida será ótima. Tome cuidado.

Greene

15 de julho de 2015
Fort Worth
  • 25 de outubro de 2017
gnasher729 disse: A maneira correta é verificando o erro. Por exemplo

se d = Double (MyValue), d> 10 {
// MeuValor continha um número e o número é> 10.
} outro {
// MeuValor não continha um número, ou o número era<= 10.
}

Isso é ambíguo - e se o valor for<= 10 should produce different results from the value being nil? To be fair, the OP's post is ambiguous as they were forcing the unwrap, meaning a nil value would crash. However in most business cases, a nil value would be handled differently (safely) from an insufficient value.

Uma maneira muito mais limpa seria:

Código: // Handle your unwrapping here, and specify what to do in case of a nil guard let d = Double(MyValue) else { return } // Then implement your if statement if d > 10 { // Do what you want if d > 10 } else { // Do what you want if d <= 10 }
Embora, eu realmente acho que MyValue deve ser armazenado como um Double desde o início, e um NumberFormatter implementado mais tarde para lidar com qualquer formatação necessária. Isso tem uma carga cognitiva muito menor para quem acaba lendo o código.
Reações:atmenterprises

gnasher729

Suspenso
25 de novembro de 2005
  • 26 de outubro de 2017
maculateConception disse: Você foi intimidado na escola? Você parece ter uma auto-estima bastante baixa porque não conseguia responder sem me atacar.

Esta será minha primeira e última comunicação com você. Sugestão para você - tente se comunicar de uma forma mais civilizada e a vida será ótima. Tome cuidado.

Bem, eu não te ataquei. Ataquei sua postagem, que demonstra que você sabe muito pouco sobre Swift, e incluí uma recomendação muito perigosa. S

SAIRUS

para
21 de agosto de 2008
  • 26 de outubro de 2017
Eu guardo na maioria das vezes, mas se cada uma das funções em uma classe guarda a mesma variável ... pode querer reconsiderar sua interface inicial.

inserir

14 de abril de 2018
  • 14 de abril de 2018
Swift, não tenho certeza se seu valor é exatamente int. Existem duas opções para garantir.
1) '!' você pode indicar que este valor será exato adicionando a marca.
Código: if (Double(MyValue)! > 10) { // } 2) Você pode especificar o tipo ao definir o valor.
Código: let value: Int = Double(MyValue)! if (value > 10) { // } PARA

atmenterprises

28 de janeiro de 2006
  • 27 de abril de 2018
ynstek disse: Swift, não tenho certeza se seu valor é exatamente int. Existem duas opções para garantir.
1) '!' você pode indicar que este valor será exato adicionando a marca.
Código: if (Double(MyValue)! > 10) { // } 2) Você pode especificar o tipo ao definir o valor.
Código: let value: Int = Double(MyValue)! if (value > 10) { // }

Acho que seu exemplo nº 2 falhará porque você está tentando atribuir um elenco de string a um double para uma variável Int. Além disso, você está assumindo que MyValue não é nulo, o que pode causar um erro de tempo de execução caso seja nulo ou não numérico.

Seu exemplo de explicação nº 1 também não está certo. Um ponto de exclamação não converte um valor em um Int. Ele desembrulha o valor de uma variável opcional. Em seu exemplo, você terminaria com um valor Double, não um Int, e somente se MyValue não fosse nulo ou um valor não numérico.