Fóra

Binární operátor Mac '>' nelze použít na operandy typu 'Double?' a 'Int'

abcdefg12345

Původní plakát
10. července 2013
  • 21. října 2017
Snažím se mít příkaz if ke kontrole, zda je dvojitá hodnota v řetězci větší než 10, ale rád bych dostal chybu 'Binární operátor '>' nelze použít na operandy typu 'Double?' a 'Int'' někdo ví, co dělám špatně.

rychlý 4
Kód: |_+_|
Používám proměnný řetězec, protože potřebuji, aby to byl řetězec, abych ho mohl později naformátovat, definoval jsem to jako
Kód: |_+_|

abcdefg12345

Původní plakát
10. července 2013


  • 21. října 2017
opravit přidáním další proměnné
Kód: |_+_|
reakce:960 design

0002378

Pozastaveno
28. května 2017
  • 23. října 2017
Myslím, že Swift jako jazyk je místy docela k smíchu, zejm. pocházející z programování v Javě. A uvedl jste jeden z nejlepších příkladů toho.

A i když volitelné příslušenství má své výhody, nutí mě také rozbít svůj počítač o horní okraje popelnice.

Kde však Swift opravdu nakopává prdel, je oddělení uzávěrů... ach jo! Java už je má taky, ale...

A samozřejmě skutečnost, že Swift je méně přísný v deklaraci typů a těch otravných středníků ... úžasné!

reakce:abcdefg12345

0002378

Pozastaveno
28. května 2017
  • 24. října 2017
Počkejte, teď, když se podívám zpět na váš kód, vidím, že vaše hodnota Double(string) je vyhodnocena jako Double?, což je volitelná hodnota.

Nepotřebujete novou proměnnou. Můžete jen přidat '!' na váš Double(string) a bude to fungovat.

Asi jsem se mýlil v tom, že Swift byla v tomto případě hloupá. Ale setkal jsem se s mnoha případy takových stížností kompilátoru (neschopných porovnat dva různé číselné typy).

Greene

15. července 2015
hodnota pevnosti
  • 24. října 2017
Myslím, že čistším a rychlejším řešením by bylo uložit vaši MyValue jako double nebo int (což se zdá být). Ke zpracování formátování pak můžete použít NumberFormatter.

Nebo můžete použít volitelnou vazbu k rozbalení hodnoty. Před použitím silového rozbalení bych nejprve vyzkoušel jednu z těchto metod

gnasher729

Pozastaveno
25. listopadu 2005
  • 24. října 2017
maculateConception řekl: Myslím, že Swift jako jazyk je občas docela k smíchu, zejm. pocházející z programování v Javě. A uvedl jste jeden z nejlepších příkladů toho.
To je docela bezradné. Problém je v tom, že OP nezná základní vlastnost Swiftu, kterou jsou volitelné hodnoty. Konstruktor Double(String) může zjevně selhat, pokud řetězec neobsahuje číslo. To je důvod, proč Double (String) nevytváří a nemůže vytvářet výsledek typu Double, ale výsledek typu Double? , to je volitelný Double. A volitelný Double nelze srovnávat s Int.

Vaše 'řešení' je opravdu, ale opravdu hrozné. ! znamená 'Jsem si jistý, že tato konverze bude úspěšná. Pokud se tak nestane, zrušte aplikaci. nechť d = Double ('1234x')! prostě havaruje. Záměrně. Protože jsi nezkontroloval nulu a byla nula.

Správným způsobem je kontrola chyby. Například

jestliže d = Double (MyValue), d > 10 {
// MojeHodnota obsahovala číslo a toto číslo je > 10.
} jinak {
// MojeHodnota neobsahovala číslo nebo číslo obsahovalo<= 10.
}

Pokud si myslíte, že stojí za to napsat kód, který je bezpečný a skutečně funguje, pak je Swift tím správným jazykem.
reakce:atmenterprises a ajthom90

0002378

Pozastaveno
28. května 2017
  • 24. října 2017
gnasher729 řekl: To je docela bezradné. Problém je v tom, že OP nezná základní vlastnost Swiftu, kterou jsou volitelné hodnoty. Konstruktor Double(String) může zjevně selhat, pokud řetězec neobsahuje číslo. To je důvod, proč Double (String) nevytváří a nemůže vytvářet výsledek typu Double, ale výsledek typu Double? , to je volitelný Double. A volitelný Double nelze srovnávat s Int.

Byl jsi ve škole šikanován? Zdá se, že máš docela nízké sebevědomí, protože jsi nedokázal odpovědět, aniž bys na mě zaútočil.

Toto bude moje první a poslední komunikace s vámi. Návrh pro vás – zkuste komunikovat civilněji a život bude skvělý. Opatruj se.

Greene

15. července 2015
hodnota pevnosti
  • 25. října 2017
gnasher729 řekl: Správný způsob je kontrola chyby. Například

jestliže d = Double (MyValue), d > 10 {
// MojeHodnota obsahovala číslo a toto číslo je > 10.
} jinak {
// MojeHodnota neobsahovala číslo nebo číslo obsahovalo<= 10.
}

To je nejednoznačné - co když 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.

Mnohem čistší způsob by byl:

Kód: |_+_|
I když si opravdu myslím, že MyValue by mělo být od začátku uloženo jako Double a NumberFormatter implementován později, aby zvládl jakékoli formátování, které je potřeba. To má mnohem nižší kognitivní zátěž pro toho, kdo skončí čtením kódu.
reakce:atmenterprises

gnasher729

Pozastaveno
25. listopadu 2005
  • 26. října 2017
maculateConception řekl: Byl jsi ve škole šikanován? Zdá se, že máš docela nízké sebevědomí, protože jsi nedokázal odpovědět, aniž bys na mě zaútočil.

Toto bude moje první a poslední komunikace s vámi. Návrh pro vás – zkuste komunikovat civilněji a život bude skvělý. Opatruj se.

No, nenapadl jsem tě. Napadl jsem váš příspěvek, který ukazuje, že o Swiftovi víte velmi málo, a uvedl jsem jedno velmi nebezpečné doporučení. S

SAIRUS

na
21. srpna 2008
  • 26. října 2017
Většinu času hlídám, ale pokud každá z funkcí ve třídě hlídá stejnou proměnnou... možná budete chtít přehodnotit své původní rozhraní.

vložit

14. dubna 2018
  • 14. dubna 2018
Swift, není si jistý, že vaše hodnota je přesně int. Existují dvě možnosti, jak se ujistit.
1) '!' přidáním značky můžete označit, že tato hodnota bude přesná int.
Kód: |_+_| 2) Při definování hodnoty můžete určit typ.
Kód: |_+_| NA

atmenterprises

28. ledna 2006
  • 27. dubna 2018
ynstek řekl: Swift, není si jistý, že vaše hodnota je přesně int. Existují dvě možnosti, jak se ujistit.
1) '!' přidáním značky můžete označit, že tato hodnota bude přesná int.
Kód: |_+_| 2) Při definování hodnoty můžete určit typ.
Kód: |_+_|

Myslím, že váš příklad č. 2 by selhal, protože se pokoušíte přiřadit přetypování řetězce na double do proměnné Int. Také předpokládáte, že MyValue není nula, což by mohlo způsobit chybu běhu, pokud by bylo nulové nebo nenumerické.

Váš příklad č. 1 vysvětlení také není správné. Vykřičník nepřevádí hodnotu na Int. Rozbalí hodnotu volitelné proměnné. Ve vašem příkladu byste skončili s hodnotou Double, nikoli s hodnotou Int, a pouze v případě, že by MojeHodnota nebyla nulová nebo nečíselná hodnota.