Forums

Mac Binaire operator '>' kan niet worden toegepast op operanden van het type 'Double?' en 'Int'

abcdefg12345

originele poster
10 juli 2013
  • 21 okt 2017
Ik probeer een if-statement te hebben om te controleren of een dubbele waarde in een string groter is dan 10, maar ik wil graag een foutmelding krijgen 'Binaire operator '>' kan niet worden toegepast op operanden van het type 'Double?' en 'Int'' weet iemand wat ik verkeerd doe.

snel 4
Code: |_+_|
ik gebruik een variabele tekenreeks omdat ik het een tekenreeks nodig heb, zodat ik het later kan formatteren, ik definieerde het als
Code: |_+_|

abcdefg12345

originele poster
10 juli 2013


  • 21 okt 2017
opgelost door een andere variabele toe te voegen
Code: |_+_|
reacties:960design

0002378

Opgeschort
28 mei 2017
  • 23 okt 2017
Ik denk dat Swift, als taal, soms best lachwekkend is, in het bijzonder. afkomstig uit Java-programmering. En je bracht daar een van de beste voorbeelden van naar voren.

En hoewel optionele opties hun voordelen hebben, zorgen ze er ook voor dat ik mijn computer tegen de bovenrand van een afvalcontainer wil slaan.

Echter, waar Swift echt kicks ass is in de afdeling sluitingen ... oh ja! Java heeft ze nu ook, maar...

En natuurlijk het feit dat Swift minder streng is in de declaratie van typen en die vervelende puntkomma's ... geweldig !

reacties:abcdefg12345

0002378

Opgeschort
28 mei 2017
  • 24 okt 2017
Oh wacht, nu ik terugkijk op je code, zie ik dat je Double(string)-waarde resulteert in Double?, wat een optionele waarde is.

Je hebt geen nieuwe variabele nodig. Je kunt gewoon '!' toevoegen naar je Double(string), en het zal werken.

Ik denk dat ik het bij het verkeerde eind had dat Swift in dit geval dom was. Maar ik ben veel gevallen van dergelijke compilerklachten tegengekomen (niet in staat om twee verschillende numerieke typen te vergelijken).

Greene

15 juli 2015
Fort Worth
  • 24 okt 2017
Ik denk dat een schonere, meer Swifty-oplossing zou zijn om je MyValue op te slaan als een double of int (wat het lijkt te zijn). U kunt dan een NumberFormatter gebruiken om de opmaak af te handelen.

Of u kunt optionele binding gebruiken om de waarde uit te pakken. Ik zou eerst een van deze methoden proberen voordat ik een force unwrap gebruik

gnasher729

Opgeschort
25 november 2005
  • 24 okt 2017
maculateConception zei: Ik denk dat Swift, als taal, soms best lachwekkend is, in het bijzonder. afkomstig uit Java-programmering. En je bracht daar een van de beste voorbeelden van naar voren.
Dat is vrij onbenullig. Het probleem is dat de OP niets weet van een basisfunctie van Swift, namelijk optionele waarden. De constructor Double(String) kan uiteraard mislukken als de String geen nummer bevat. Dat is de reden waarom Double (String) geen resultaat van het type Double produceert en niet kan produceren, maar een resultaat van het type Double? , dat is een optionele Double. En een optionele Double is niet te vergelijken met een Int.

Je 'oplossing' is echt, echt verschrikkelijk. De ! betekent 'Ik weet zeker dat deze conversie zal slagen. Als dit niet het geval is, moet u de app laten crashen'. laat d = Dubbel ('1234x')! zal gewoon crashen. opzettelijk. Omdat je niet op nul hebt gecontroleerd, en het was nul.

De juiste manier is controleren op de fout. Bijvoorbeeld

als laat d = Dubbel (Mijn Waarde), d > 10 {
// MyValue bevatte een getal en het getal is > 10.
} anders {
// MyValue bevatte geen nummer, of het nummer was<= 10.
}

Als je denkt dat het de moeite waard is om code te schrijven die veilig is en ook echt werkt, dan is Swift de juiste taal.
reacties:Atmenterprises en ajthom90

0002378

Opgeschort
28 mei 2017
  • 24 okt 2017
gnasher729 zei: Dat is nogal dom. Het probleem is dat de OP niets weet van een basisfunctie van Swift, namelijk optionele waarden. De constructor Double(String) kan uiteraard mislukken als de String geen nummer bevat. Dat is de reden waarom Double (String) geen resultaat van het type Double produceert en niet kan produceren, maar een resultaat van het type Double? , dat is een optionele Double. En een optionele Double is niet te vergelijken met een Int.

Werd je gepest op school? Je lijkt een vrij laag zelfbeeld te hebben omdat je niet kon reageren zonder me aan te vallen.

Dit zal mijn eerste en laatste bericht aan u zijn. Suggestie voor jou - probeer op een meer beschaafde manier te communiceren, en het leven zal geweldig zijn. Wees voorzichtig.

Greene

15 juli 2015
Fort Worth
  • 25 okt 2017
gnasher729 zei: De juiste manier is om de fout te controleren. Bijvoorbeeld

als laat d = Dubbel (Mijn Waarde), d > 10 {
// MyValue bevatte een getal en het getal is > 10.
} anders {
// MyValue bevatte geen nummer, of het nummer was<= 10.
}

Dit is dubbelzinnig - wat als de waarde is<= 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.

Een veel schonere manier zou zijn:

Code: |_+_|
Hoewel, ik denk echt dat MyValue vanaf het begin als een Double moet worden opgeslagen en dat een NumberFormatter later moet worden geïmplementeerd om alle opmaak te verwerken die nodig is. Dat heeft een veel lagere cognitieve belasting voor degene die de code leest.
reacties:werkplaatsen

gnasher729

Opgeschort
25 november 2005
  • 26 okt 2017
maculateConception zei: Werd je gepest op school? Je lijkt een vrij laag zelfbeeld te hebben omdat je niet kon reageren zonder me aan te vallen.

Dit zal mijn eerste en laatste bericht aan u zijn. Suggestie voor jou - probeer op een meer beschaafde manier te communiceren, en het leven zal geweldig zijn. Wees voorzichtig.

Nou, ik heb je niet aangevallen. Ik heb je bericht aangevallen, wat aantoont dat je heel weinig weet over Swift, en ik heb een zeer gevaarlijke aanbeveling opgenomen. S

SAIRUS

tot
21 aug. 2008
  • 26 okt 2017
Ik bewaak het merendeel van de keren, maar als elk van de functies in een klasse dezelfde variabele bewaakt... wil je misschien je initiële interface heroverwegen.

invoegen

14 april 2018
  • 14 april 2018
Swift, weet niet zeker of uw waarde precies int is. Er zijn twee opties om er zeker van te zijn.
1) '!' u kunt aangeven dat deze waarde exact int zal zijn door het teken toe te voegen.
Code: |_+_| 2) U kunt het type specificeren bij het definiëren van de waarde.
Code: |_+_| TOT

werkplaatsen

28 januari 2006
  • 27 april 2018
ynstek zei: Swift, weet niet zeker of je waarde precies int is. Er zijn twee opties om er zeker van te zijn.
1) '!' u kunt aangeven dat deze waarde exact int zal zijn door het teken toe te voegen.
Code: |_+_| 2) U kunt het type specificeren bij het definiëren van de waarde.
Code: |_+_|

Ik denk dat je #2 voorbeeld zou mislukken omdat je probeert een string cast toe te wijzen aan een double naar een Int variabele. Ook ga je ervan uit dat MyValue niet nul is, wat een runtime-fout kan veroorzaken als deze nul of niet-numeriek is.

Uw #1 voorbeeldverklaring klopt ook niet. Een uitroepteken zet een waarde niet om in een Int. Het pakt de waarde van een optionele variabele uit. In jouw voorbeeld zou je eindigen met een dubbele waarde, geen Int, en alleen als MyValue niet nul of een niet-numerieke waarde was.