Fóra

Binárny operátor Mac '>' nemožno použiť na operandy typu 'Double?' a 'Int'

abcdefg12345

Pôvodný plagát
10. júla 2013
  • 21. októbra 2017
Snažím sa mať príkaz if na kontrolu, či je dvojitá hodnota v reťazci väčšia ako 10, ale chcel by som dostať chybu 'Binárny operátor '>' nemožno použiť na operandy typu 'Double?' a 'Int'' niekto vie, čo robím zle.

rýchly 4
Kód: |_+_|
Používam premenný reťazec, pretože potrebujem, aby to bol reťazec, aby som ho mohol neskôr naformátovať, definoval som ho ako
Kód: |_+_|

abcdefg12345

Pôvodný plagát
10. júla 2013


  • 21. októbra 2017
opraviť pridaním ďalšej premennej
Kód: |_+_|
reakcie:960 dizajn

0002378

Pozastavené
28. mája 2017
  • 23. októbra 2017
Myslím, že Swift ako jazyk je miestami dosť na smiech, napr. pochádzajúce z programovania v jazyku Java. A uviedol si jeden z najlepších príkladov toho.

A hoci voliteľné doplnky majú svoje výhody, tiež ma nútia rozbiť svoj počítač o horné okraje kontajnera.

Avšak tam, kde Swift skutočne nakopáva zadok, je oddelenie uzáverov ... ach áno! Java ich už má tiež, ale...

A, samozrejme, skutočnosť, že Swift je menej prísna v deklarácii typov a tých otravných bodkočiarok ... úžasné!

reakcie:abcdefg12345

0002378

Pozastavené
28. mája 2017
  • 24. októbra 2017
Počkať, teraz, keď sa pozriem späť na váš kód, vidím, že vaša hodnota Double (reťazec) sa vyhodnotí ako Double?, čo je voliteľná hodnota.

Nepotrebujete novú premennú. Môžete len pridať '!' na váš Double(string) a bude to fungovať.

Asi som sa mýlil v tom, že Swift bola v tomto prípade hlúpa. Ale stretol som sa s mnohými prípadmi takýchto sťažností na kompilátor (neschopný porovnať dva rôzne číselné typy).

Greene

15. júla 2015
Fort Worth
  • 24. októbra 2017
Myslím si, že čistejším a rýchlejším riešením by bolo uložiť vašu MyValue ako double alebo int (čo sa zdá byť). Potom môžete použiť NumberFormatter na spracovanie formátovania.

Alebo môžete použiť voliteľnú väzbu na rozbalenie hodnoty. Pred použitím silového rozbalenia by som najskôr vyskúšal jednu z týchto metód

gnasher729

Pozastavené
25. novembra 2005
  • 24. októbra 2017
maculateConception povedal: Myslím si, že Swift ako jazyk je niekedy dosť na smiech, napr. pochádzajúce z programovania v jazyku Java. A uviedol si jeden z najlepších príkladov toho.
To je celkom bezradné. Problém je v tom, že OP nevie o základnej vlastnosti Swift, ktorou sú voliteľné hodnoty. Konštruktor Double(String) môže zjavne zlyhať, ak reťazec neobsahuje číslo. Preto Double (String) nevytvára a ani nemôže produkovať výsledok typu Double, ale výsledok typu Double? , teda voliteľný Double. A voliteľný Double nemožno porovnávať s Int.

Tvoje 'riešenie' je naozaj hrozné. ! znamená „Som si istý, že táto konverzia bude úspešná. Ak sa tak nestane, zrušte aplikáciu. nech d = Double ('1234x')! len havaruje. Zámerne. Pretože ste nekontrolovali nulu a bola nula.

Správny spôsob je kontrola chyby. Napríklad

ak nech d = Double (MyValue), d > 10 {
// MojaHodnota obsahovala číslo a toto číslo je > 10.
} inak {
// MojaHodnota neobsahovala číslo alebo číslo obsahovalo<= 10.
}

Ak si myslíte, že stojí za to napísať kód, ktorý je bezpečný a skutočne funguje, potom je Swift tým správnym jazykom.
reakcie:atmenterprises a ajthom90

0002378

Pozastavené
28. mája 2017
  • 24. októbra 2017
gnasher729 povedal: To je celkom bezradné. Problém je v tom, že OP nevie o základnej vlastnosti Swift, ktorou sú voliteľné hodnoty. Konštruktor Double(String) môže zjavne zlyhať, ak reťazec neobsahuje číslo. Preto Double (String) nevytvára a ani nemôže produkovať výsledok typu Double, ale výsledok typu Double? , teda voliteľný Double. A voliteľný Double nemožno porovnávať s Int.

Bol si šikanovaný v škole? Zdá sa, že máš dosť nízke sebavedomie, pretože si nedokázal odpovedať bez toho, aby si na mňa zaútočil.

Toto bude moja prvá a posledná komunikácia s vami. Návrh pre vás – skúste komunikovať civilnejšie a život bude skvelý. opatruj sa.

Greene

15. júla 2015
Fort Worth
  • 25. októbra 2017
gnasher729 povedal: Správny spôsob je kontrola chyby. Napríklad

ak nech d = Double (MyValue), d > 10 {
// MojaHodnota obsahovala číslo a toto číslo je > 10.
} inak {
// MojaHodnota neobsahovala číslo alebo číslo obsahovalo<= 10.
}

To je nejednoznačné - čo ak hodnota je<= 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.

Oveľa čistejší spôsob by bol:

Kód: |_+_|
Aj keď si naozaj myslím, že MyValue by malo byť od začiatku uložené ako Double a NumberFormatter implementovaný neskôr, aby zvládlo akékoľvek potrebné formátovanie. To má oveľa nižšiu kognitívnu záťaž pre každého, kto skončí pri čítaní kódu.
reakcie:atmenterprises

gnasher729

Pozastavené
25. novembra 2005
  • 26. októbra 2017
maculateConception povedal: Boli ste šikanovaní v škole? Zdá sa, že máš dosť nízke sebavedomie, pretože si nedokázal odpovedať bez toho, aby si na mňa zaútočil.

Toto bude moja prvá a posledná komunikácia s vami. Návrh pre vás – skúste komunikovať civilnejšie a život bude skvelý. opatruj sa.

No ja som na teba nezaútočil. Zaútočil som na váš príspevok, ktorý dokazuje, že o Swift viete veľmi málo, a uviedol som jedno veľmi nebezpečné odporúčanie. S

SAIRUS

do
21. august 2008
  • 26. októbra 2017
Väčšinu času strážim, ale ak každá z funkcií v triede chráni rovnakú premennú... možno budete chcieť prehodnotiť svoje pôvodné rozhranie.

vložiť

14. apríla 2018
  • 14. apríla 2018
Swift si nie je istý, či je vaša hodnota presne int. Existujú dve možnosti, ako sa uistiť.
1) '!' pridaním značky môžete určiť, že táto hodnota bude presná int.
Kód: |_+_| 2) Pri definovaní hodnoty môžete určiť typ.
Kód: |_+_| TO

atmenterprises

28. januára 2006
  • 27. apríla 2018
ynstek povedal: Swift, nie je si istý, či je vaša hodnota presne int. Existujú dve možnosti, ako sa uistiť.
1) '!' pridaním značky môžete určiť, že táto hodnota bude presná int.
Kód: |_+_| 2) Pri definovaní hodnoty môžete určiť typ.
Kód: |_+_|

Myslím si, že váš príklad č. 2 by zlyhal, pretože sa pokúšate priradiť reťazec cast na double do premennej Int. Tiež predpokladáte, že MyValue nie je nula, čo by mohlo spôsobiť chybu pri spustení, ak by bolo nulové alebo nečíselné.

Váš príklad č. 1 vysvetlenie tiež nie je správne. Výkričník nekonvertuje hodnotu na Int. Rozbalí hodnotu voliteľnej premennej. Vo vašom príklade by ste skončili s hodnotou Double, nie s hodnotou Int, a to iba vtedy, ak by MojaHodnota nebola nulová alebo nenumerická hodnota.