Forumuri

Operatorul binar Mac „>” nu poate fi aplicat operanzilor de tip „Dublu?” și „Int”

abcdefg12345

Poster original
10 iulie 2013
  • 21 octombrie 2017
Încerc să am o instrucțiune if pentru a verifica dacă o valoare dublă dintr-un șir este mai mare de 10, dar vreau să obțin o eroare „Operatorul binar „>” nu poate fi aplicat operanzilor de tip „Dublu?” și „Int” oricine știe ce greșesc.

rapid 4
Cod: |_+_|
Folosesc un șir variabil pentru că am nevoie să fie un șir ca să îl pot formata mai târziu, l-am definit ca
Cod: |_+_|

abcdefg12345

Poster original
10 iulie 2013


  • 21 octombrie 2017
a rezolvat-o prin adăugarea unei alte variabile
Cod: |_+_|
Reacții:960design

0002378

Suspendat
28 mai 2017
  • 23 octombrie 2017
Cred că Swift, ca limbă, este destul de de râs uneori, mai ales. provenind din programarea Java. Și ai adus în discuție unul dintre cele mai bune exemple în acest sens.

Și, deși opționalele au beneficiile lor, ele mă fac, de asemenea, să vreau să-mi sparg computerul de marginile superioare ale unui tomberon.

Totuși, locul în care Swift dă cu picioarele în fund este în departamentul de închideri... oh, da! Java le are și ele acum, dar...

Și, bineînțeles, faptul că Swift este mai puțin riguros în declararea tipurilor și a aceluiași punct și virgulă... minunat!

Reacții:abcdefg12345

0002378

Suspendat
28 mai 2017
  • 24 octombrie 2017
Oh, stai, acum că mă uit înapoi la codul tău, văd că valoarea ta Double(string) se evaluează la Double?, care este o valoare opțională.

Nu aveți nevoie de o nouă variabilă. Puteți adăuga doar „!” la Double (șir) și va funcționa.

Cred că m-am înșelat când Swift a fost prost în acest caz. Dar, am întâlnit multe cazuri de astfel de plângeri ale compilatorului (nu pot compara două tipuri numerice diferite).

Greene

15 iulie 2015
Fort Worth
  • 24 octombrie 2017
Cred că o soluție mai curată și mai Swifty ar fi să vă stocați MyValue ca dublu sau int (ceea ce pare să fie). Puteți utiliza apoi un NumberFormatter pentru a gestiona formatarea.

Sau puteți utiliza legarea opțională pentru a despacheta valoarea. Aș încerca mai întâi una dintre aceste metode înainte de a folosi o desfacere forțată

gnasher729

Suspendat
25 noiembrie 2005
  • 24 octombrie 2017
maculateConception a spus: Cred că Swift, ca limbă, este destul de de râs uneori, mai ales. provenind din programarea Java. Și ai adus în discuție unul dintre cele mai bune exemple în acest sens.
Este destul de necunoscut. Problema este că OP nu știe despre o caracteristică de bază a Swift, care sunt valorile opționale. Constructorul Double(String) poate eșua în mod evident dacă șirul nu conține un număr. De aceea Double (String) nu produce și nu poate produce un rezultat de tip Double, ci unul de tip Double? , adică un Double opțional. Și un Double opțional nu poate fi comparat cu un Int.

„Soluția” ta este cu adevărat, cu adevărat îngrozitoare. Cel! înseamnă „Sunt sigur că această conversie va reuși. Dacă nu, atunci vă rugăm să blocați aplicația”. fie d = dublu ('1234x')! pur și simplu se va prăbuși. Intentionat. Pentru că nu ai verificat pentru zero și a fost zero.

Modul corect este verificarea erorii. De exemplu

dacă d = Double (MyValue), d > 10 {
// MyValue conținea un număr, iar numărul este > 10.
} altfel {
// MyValue nu conținea un număr, sau numărul era<= 10.
}

Dacă credeți că merită să scrieți cod sigur și care funcționează efectiv, atunci Swift este limbajul potrivit.
Reacții:atmenterprises si ajthom90

0002378

Suspendat
28 mai 2017
  • 24 octombrie 2017
gnasher729 a spus: Este destul de necunoscut. Problema este că OP nu știe despre o caracteristică de bază a Swift, care sunt valorile opționale. Constructorul Double(String) poate eșua în mod evident dacă șirul nu conține un număr. De aceea Double (String) nu produce și nu poate produce un rezultat de tip Double, ci unul de tip Double? , adică un Double opțional. Și un Double opțional nu poate fi comparat cu un Int.

Ai fost intimidat la scoala? Se pare că ai o stima de sine destul de scăzută pentru că nu ai putut răspunde fără să mă ataci.

Aceasta va fi prima și ultima mea comunicare cu tine. Sugestie pentru tine - încearcă să comunici într-un mod mai civil, iar viața va fi grozavă. Ai grijă.

Greene

15 iulie 2015
Fort Worth
  • 25 octombrie 2017
gnasher729 a spus: Modul corect este verificarea erorii. De exemplu

dacă d = Double (MyValue), d > 10 {
// MyValue conținea un număr, iar numărul este > 10.
} altfel {
// MyValue nu conținea un număr, sau numărul era<= 10.
}

Acest lucru este ambiguu - ce se întâmplă dacă valoarea fiind<= 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.

O modalitate mult mai curată ar fi:

Cod: |_+_|
Deși, chiar cred că MyValue ar trebui să fie stocat ca un Double de la început și un NumberFormatter implementat mai târziu pentru a gestiona orice formatare este necesară. Aceasta are o povară cognitivă mult mai mică pentru oricine ajunge să citească codul.
Reacții:atmenterprises

gnasher729

Suspendat
25 noiembrie 2005
  • 26 octombrie 2017
maculateConception a spus: Ai fost intimidat la scoala? Se pare că ai o stima de sine destul de scăzută pentru că nu ai putut răspunde fără să mă ataci.

Aceasta va fi prima și ultima mea comunicare cu tine. Sugestie pentru tine - încearcă să comunici într-un mod mai civil, iar viața va fi grozavă. Ai grijă.

Ei bine, nu te-am atacat. Am atacat postarea ta, care demonstrează că știi foarte puține despre Swift și am inclus o recomandare foarte periculoasă. S

SAIRUS

la
21 august 2008
  • 26 octombrie 2017
Păzesc de cele mai multe ori, dar dacă fiecare dintre funcțiile dintr-o clasă păstrează aceeași variabilă... ar putea dori să vă reconsiderați interfața inițială.

introduce

14 aprilie 2018
  • 14 aprilie 2018
Swift, nu este sigur că valoarea ta este exact int. Există două opțiuni pentru a fi sigur.
1) '!' puteți indica că această valoare va fi exact int prin adăugarea marcajului.
Cod: |_+_| 2) Puteți specifica tipul atunci când definiți valoarea.
Cod: |_+_| LA

atmenterprises

28 ianuarie 2006
  • 27 apr 2018
ynstek a spus: Swift, nu este sigur că valoarea ta este exact int. Există două opțiuni pentru a fi sigur.
1) '!' puteți indica că această valoare va fi exact int prin adăugarea marcajului.
Cod: |_+_| 2) Puteți specifica tipul atunci când definiți valoarea.
Cod: |_+_|

Cred că exemplul dvs. #2 ar eșua deoarece încercați să atribuiți o distribuție de șir unui dublu unei variabile Int. De asemenea, presupuneți că MyValue nu este zero, ceea ce ar putea cauza o eroare de rulare dacă ar fi zero sau non-numerică.

Nici exemplul tău de explicație numărul 1 nu este corect. Un semn de exclamare nu convertește o valoare într-o valoare Int. Desface valoarea unei variabile opționale. În exemplul dvs., veți ajunge cu o valoare Double, nu cu o valoare Int și numai dacă MyValue nu a fost zero sau o valoare non-numerică.