Forum

L'operatore binario Mac '>' non può essere applicato agli operandi di tipo 'Double?' e 'Int'

abcdefg12345

Manifesto originale
10 luglio 2013
  • 21 ottobre 2017
Sto cercando di avere un'istruzione if per verificare se un valore double in una stringa è maggiore di 10, ma desidero ricevere un errore 'Operatore binario '>' non può essere applicato agli operandi di tipo 'Double?' e 'Int'' qualcuno sa cosa sto facendo di sbagliato.

veloce 4
Codice: |_+_|
sto usando una stringa variabile perché ho bisogno che sia una stringa in modo da poterla formattare in seguito, l'ho definita come
Codice: |_+_|

abcdefg12345

Manifesto originale
10 luglio 2013


  • 21 ottobre 2017
risolto aggiungendo un'altra variabile
Codice: |_+_|
Reazioni:960design

0002378

Sospeso
28 maggio 2017
  • 23 ottobre 2017
Penso che Swift, come lingua, a volte sia abbastanza ridicolo, specialmente. proveniente dalla programmazione Java. E ne hai tirato fuori uno dei migliori esempi.

E, mentre gli optional hanno i loro vantaggi, mi fanno venire voglia di sbattere il mio computer contro i bordi superiori di un cassonetto.

Tuttavia, dove Swift fa davvero il culo è nel dipartimento delle chiusure ... oh sì! Anche Java li ha, ora, ma...

E, naturalmente, il fatto che Swift sia meno severo nella dichiarazione dei tipi e quei fastidiosi punti e virgola... fantastico!

Reazioni:abcdefg12345

0002378

Sospeso
28 maggio 2017
  • 24 ottobre 2017
Oh aspetta, ora che guardo indietro al tuo codice, vedo che il tuo valore Double(string) restituisce Double?, che è un valore facoltativo.

Non hai bisogno di una nuova variabile. Puoi semplicemente aggiungere '!' al tuo Double(string) e funzionerà.

Immagino di sbagliarmi sul fatto che Swift fosse stupido in questo caso. Ma ho riscontrato molti casi di tali lamentele del compilatore (incapace di confrontare due diversi tipi numerici).

verde

15 luglio 2015
Fort Worth
  • 24 ottobre 2017
Penso che una soluzione più pulita e più rapida sarebbe quella di memorizzare il tuo MyValue come double o int (che sembra essere). È quindi possibile utilizzare un NumberFormatter per gestire la formattazione.

Oppure puoi utilizzare l'associazione facoltativa per scartare il valore. Proverei uno di questi metodi prima di utilizzare uno scarto forzato

gnasher729

Sospeso
25 novembre 2005
  • 24 ottobre 2017
maculateConception ha detto: Penso che Swift, come linguaggio, a volte sia abbastanza ridicolo, specialmente. proveniente dalla programmazione Java. E ne hai tirato fuori uno dei migliori esempi.
Questo è abbastanza all'oscuro. Il problema è che l'OP non conosce una caratteristica di base di Swift, ovvero i valori facoltativi. Il costruttore Double(String) può ovviamente fallire se la String non contiene un numero. Ecco perché Double (String) non produce e non può produrre un risultato di tipo Double, ma uno di tipo Double? , questo è un Double opzionale. E un Double opzionale non può essere paragonato a un Int.

La tua 'soluzione' è davvero, davvero terribile. Il ! significa 'Sono sicuro che questa conversione avrà successo. In caso contrario, arrestare l'app'. let d = Double ('1234x')! andrà in crash. Intenzionalmente. Perché non hai controllato per zero, ed era zero.

Il modo corretto è controllare l'errore. Per esempio

se sia d = Double (MyValue), d > 10 {
// MyValue conteneva un numero e il numero è > 10.
} altro {
// MyValue non conteneva un numero o il numero era<= 10.
}

Se pensi che valga la pena scrivere codice che sia sicuro e che funzioni davvero, allora Swift è il linguaggio giusto.
Reazioni:atmenterprises e ajthom90

0002378

Sospeso
28 maggio 2017
  • 24 ottobre 2017
gnasher729 ha detto: Questo è abbastanza all'oscuro. Il problema è che l'OP non conosce una caratteristica di base di Swift, ovvero i valori facoltativi. Il costruttore Double(String) può ovviamente fallire se la String non contiene un numero. Ecco perché Double (String) non produce e non può produrre un risultato di tipo Double, ma uno di tipo Double? , questo è un Double opzionale. E un Double opzionale non può essere paragonato a un Int.

Sei stato vittima di bullismo a scuola? Sembri avere un'autostima piuttosto bassa perché non hai potuto rispondere senza attaccarmi.

Questa sarà la mia prima e ultima comunicazione con te. Suggerimento per te: prova a comunicare in modo più civile e la vita sarà fantastica. Stai attento.

verde

15 luglio 2015
Fort Worth
  • 25 ottobre 2017
gnasher729 ha detto: Il modo corretto è controllare l'errore. Per esempio

se sia d = Double (MyValue), d > 10 {
// MyValue conteneva un numero e il numero è > 10.
} altro {
// MyValue non conteneva un numero o il numero era<= 10.
}

Questo è ambiguo - e se il valore fosse?<= 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.

Un modo molto più pulito sarebbe:

Codice: |_+_|
Tuttavia, penso davvero che MyValue dovrebbe essere archiviato come Double fin dall'inizio e un NumberFormatter implementato in seguito per gestire qualsiasi formattazione necessaria. Questo ha un carico cognitivo molto più basso per chi finisce per leggere il codice.
Reazioni:imprese

gnasher729

Sospeso
25 novembre 2005
  • 26 ottobre 2017
maculateConception ha detto: Sei stato vittima di bullismo a scuola? Sembri avere un'autostima piuttosto bassa perché non hai potuto rispondere senza attaccarmi.

Questa sarà la mia prima e ultima comunicazione con te. Suggerimento per te: prova a comunicare in modo più civile e la vita sarà fantastica. Stai attento.

Beh, non ti ho attaccato. Ho attaccato il tuo post, che dimostra che sai molto poco di Swift, e ho incluso una raccomandazione molto pericolosa. S

SAIRUS

a
21 agosto 2008
  • 26 ottobre 2017
Guardo la maggior parte delle volte, ma se ciascuna delle funzioni in una classe protegge la stessa variabile ... potrebbe voler riconsiderare la tua interfaccia iniziale.

inserire

14 aprile 2018
  • 14 aprile 2018
Swift, non è sicuro che il tuo valore sia esattamente int. Ci sono due opzioni per essere sicuri.
1) '!' puoi indicare che questo valore sarà esatto int aggiungendo il segno.
Codice: |_+_| 2) È possibile specificare il tipo quando si definisce il valore.
Codice: |_+_| A

imprese

28 gennaio 2006
  • 27 aprile 2018
ynstek ha detto: Swift, non è sicuro che il tuo valore sia esattamente int. Ci sono due opzioni per essere sicuri.
1) '!' puoi indicare che questo valore sarà esatto int aggiungendo il segno.
Codice: |_+_| 2) È possibile specificare il tipo quando si definisce il valore.
Codice: |_+_|

Penso che il tuo esempio n. 2 fallirebbe perché stai cercando di assegnare un cast di stringa a un doppio a una variabile Int. Inoltre, stai assumendo che MyValue non sia nullo, il che potrebbe causare un errore di runtime se fosse nullo o non numerico.

Neanche la tua spiegazione di esempio n. 1 è corretta. Un punto esclamativo non converte un valore in un Int. Scarta il valore di una variabile facoltativa. Nel tuo esempio, ti ritroverai con un valore Double, non un Int, e solo se MyValue non fosse zero o un valore non numerico.