Φόρουμ

Ο τελεστής Mac Binary '>' δεν μπορεί να εφαρμοστεί σε τελεστές τύπου 'Double?' και 'Int'

abcdefg12345

Πρωτότυπη αφίσα
10 Ιουλίου 2013
  • 21 Οκτωβρίου 2017
Προσπαθώ να έχω μια εντολή if για να ελέγξω αν μια διπλή τιμή σε μια συμβολοσειρά είναι μεγαλύτερη από 10, αλλά θέλω να λάβω ένα σφάλμα 'Δυαδικός τελεστής '>' δεν μπορεί να εφαρμοστεί σε τελεστές τύπου 'Διπλός;' και 'Int' κάποιος ξέρει τι κάνω λάθος.

γρήγορος 4
Κωδικός: |_+_|
χρησιμοποιώ μια μεταβλητή συμβολοσειρά επειδή χρειάζομαι να είναι συμβολοσειρά για να μπορώ να τη μορφοποιήσω αργότερα, την όρισα ως
Κωδικός: |_+_|

abcdefg12345

Πρωτότυπη αφίσα
10 Ιουλίου 2013


  • 21 Οκτωβρίου 2017
το διόρθωσε προσθέτοντας μια άλλη μεταβλητή
Κωδικός: |_+_|
Αντιδράσεις:960design

0002378

Ανασταλεί
28 Μαΐου 2017
  • 23 Οκτωβρίου 2017
Νομίζω ότι η Swift, ως γλώσσα, είναι αρκετά γελαστή μερικές φορές, π.χ. προέρχονται από τον προγραμματισμό Java. Και, αναφέρατε ένα από τα καλύτερα παραδείγματα αυτού.

Και, ενώ τα προαιρετικά έχουν τα πλεονεκτήματά τους, με κάνουν επίσης να θέλω να σπάσω τον υπολογιστή μου στις επάνω άκρες ενός κάδου.

Ωστόσο, εκεί που η Swift πραγματικά τσακώνει είναι στο τμήμα κλεισίματος ... ω ναι! Τα έχει και η Java τώρα, αλλά...

Και, φυσικά, το γεγονός ότι το Swift είναι λιγότερο αυστηρό στη δήλωση τύπων και αυτά τα ενοχλητικά ερωτηματικά ... φοβερά!

Αντιδράσεις:abcdefg12345

0002378

Ανασταλεί
28 Μαΐου 2017
  • 24 Οκτωβρίου 2017
Ω, περιμένετε, τώρα που ανατρέχω στον κώδικά σας, βλέπω ότι η τιμή Double(string) σας υπολογίζεται σε Double?, η οποία είναι μια προαιρετική τιμή.

Δεν χρειάζεστε νέα μεταβλητή. Μπορείτε απλώς να προσθέσετε '!' στο Double(string) σας και θα λειτουργήσει.

Υποθέτω ότι έκανα λάθος που η Swift ήταν ανόητη σε αυτή την περίπτωση. Όμως, έχω συναντήσει πολλές περιπτώσεις τέτοιων παραπόνων μεταγλωττιστή (δεν μπορώ να συγκρίνω δύο διαφορετικούς αριθμούς τύπους).

Γκριν

15 Ιουλίου 2015
Φορτ Γουόρθ
  • 24 Οκτωβρίου 2017
Νομίζω ότι μια πιο καθαρή, πιο γρήγορη λύση θα ήταν να αποθηκεύσετε το MyValue σας ως διπλό ή int (όπως φαίνεται να είναι). Στη συνέχεια, μπορείτε να χρησιμοποιήσετε ένα NumberFormatter για να χειριστείτε τη μορφοποίηση.

Ή μπορείτε να χρησιμοποιήσετε προαιρετικό δέσιμο για να ξετυλίξετε την τιμή. Θα δοκίμαζα πρώτα μία από αυτές τις μεθόδους πριν χρησιμοποιήσω ένα δυναμικό ξετύλιγμα

gnasher729

Ανασταλεί
25 Νοεμβρίου 2005
  • 24 Οκτωβρίου 2017
maculateConception είπε: Νομίζω ότι η Swift, ως γλώσσα, είναι αρκετά γελοία μερικές φορές, π.χ. προέρχονται από τον προγραμματισμό Java. Και, αναφέρατε ένα από τα καλύτερα παραδείγματα αυτού.
Αυτό είναι εντελώς ανίδεο. Το πρόβλημα είναι ότι το OP δεν γνωρίζει για ένα βασικό χαρακτηριστικό του Swift, το οποίο είναι οι προαιρετικές τιμές. Ο κατασκευαστής Double(String) μπορεί προφανώς να αποτύχει εάν η συμβολοσειρά δεν περιέχει αριθμό. Γι' αυτό το Double (String) δεν παράγει και δεν μπορεί να παράγει αποτέλεσμα τύπου Double, αλλά ένα τύπου Double; , δηλαδή ένα προαιρετικό Διπλό. Και ένα προαιρετικό Double δεν μπορεί να συγκριθεί με ένα Int.

Η «λύση» σας είναι πραγματικά, πραγματικά απαίσια. Ο ! σημαίνει «Είμαι σίγουρος ότι αυτή η μετατροπή θα πετύχει. Εάν δεν συμβεί, παρακαλούμε να διαγράψετε την εφαρμογή». έστω d = Διπλό ('1234x')! απλά θα συντριβεί. Εκ προθέσεως. Γιατί δεν έλεγξες για μηδέν, και ήταν μηδέν.

Ο σωστός τρόπος είναι ο έλεγχος για το σφάλμα. Για παράδειγμα

αν έστω d = Double (MyValue), d > 10 {
// Το MyValue περιείχε έναν αριθμό και ο αριθμός είναι > 10.
} αλλο {
// Το MyValue δεν περιείχε αριθμό ή ο αριθμός ήταν<= 10.
}

Εάν πιστεύετε ότι αξίζει τον κόπο να γράψετε κώδικα που να είναι ασφαλής και να λειτουργεί πραγματικά, τότε το Swift είναι η σωστή γλώσσα.
Αντιδράσεις:atmentterprises και ajthom90

0002378

Ανασταλεί
28 Μαΐου 2017
  • 24 Οκτωβρίου 2017
gnasher729 είπε: Αυτό είναι εντελώς ανίδεο. Το πρόβλημα είναι ότι το OP δεν γνωρίζει για ένα βασικό χαρακτηριστικό του Swift, το οποίο είναι οι προαιρετικές τιμές. Ο κατασκευαστής Double(String) μπορεί προφανώς να αποτύχει εάν η συμβολοσειρά δεν περιέχει αριθμό. Γι' αυτό το Double (String) δεν παράγει και δεν μπορεί να παράγει αποτέλεσμα τύπου Double, αλλά ένα τύπου Double; , δηλαδή ένα προαιρετικό Διπλό. Και ένα προαιρετικό Double δεν μπορεί να συγκριθεί με ένα Int.

Δέχτηκες bullying στο σχολείο; Φαίνεται να έχεις αρκετά χαμηλή αυτοεκτίμηση γιατί δεν μπορούσες να απαντήσεις χωρίς να μου επιτεθείς.

Αυτή θα είναι η πρώτη και τελευταία μου επικοινωνία μαζί σας. Πρόταση σε εσάς - προσπαθήστε να επικοινωνήσετε με έναν πιο πολιτισμένο τρόπο και η ζωή θα είναι υπέροχη. Να προσέχεις.

Γκριν

15 Ιουλίου 2015
Φορτ Γουόρθ
  • 25 Οκτωβρίου 2017
gnasher729 είπε: Ο σωστός τρόπος είναι ο έλεγχος για το σφάλμα. Για παράδειγμα

αν έστω d = Double (MyValue), d > 10 {
// Το MyValue περιείχε έναν αριθμό και ο αριθμός είναι > 10.
} αλλο {
// Το MyValue δεν περιείχε αριθμό ή ο αριθμός ήταν<= 10.
}

Αυτό είναι διφορούμενο - τι θα συμβεί αν η αξία είναι<= 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.

Ένας πολύ πιο καθαρός τρόπος θα ήταν:

Κωδικός: |_+_|
Ωστόσο, πραγματικά πιστεύω ότι το MyValue θα πρέπει να αποθηκευτεί ως Double από την αρχή και ένα NumberFormatter να εφαρμοστεί αργότερα για να χειριστεί οποιαδήποτε μορφοποίηση χρειάζεται. Αυτό έχει πολύ μικρότερο γνωστικό βάρος για όποιον καταλήγει να διαβάζει τον κώδικα.
Αντιδράσεις:επιχειρήσεις

gnasher729

Ανασταλεί
25 Νοεμβρίου 2005
  • 26 Οκτωβρίου 2017
maculateConception είπε: Υπήρξατε εκφοβισμός στο σχολείο; Φαίνεται να έχεις αρκετά χαμηλή αυτοεκτίμηση γιατί δεν μπορούσες να απαντήσεις χωρίς να μου επιτεθείς.

Αυτή θα είναι η πρώτη και τελευταία μου επικοινωνία μαζί σας. Πρόταση σε εσάς - προσπαθήστε να επικοινωνήσετε με έναν πιο πολιτισμένο τρόπο και η ζωή θα είναι υπέροχη. Να προσέχεις.

Λοιπόν, δεν σου επιτέθηκα. Επιτέθηκα στη δημοσίευσή σας, η οποία δείχνει ότι γνωρίζετε πολύ λίγα για τη Swift και συμπεριέλαβε μια πολύ επικίνδυνη σύσταση. μικρό

ΣΑΙΡΟΥΣ

προς το
21 Αυγούστου 2008
  • 26 Οκτωβρίου 2017
Προστατεύω τις περισσότερες φορές, αλλά αν καθεμία από τις συναρτήσεις σε μια κλάση προστατεύει την ίδια μεταβλητή...ίσως να θέλετε να επανεξετάσετε την αρχική σας διεπαφή.

εισάγετε

14 Απριλίου 2018
  • 14 Απριλίου 2018
Ο Swift, δεν είναι σίγουρος ότι η τιμή σας είναι ακριβώς μεσαία. Υπάρχουν δύο επιλογές για να βεβαιωθείτε.
1) '!' μπορείτε να υποδείξετε ότι αυτή η τιμή θα είναι ακριβής, προσθέτοντας το σημάδι.
Κωδικός: |_+_| 2) Μπορείτε να καθορίσετε τον τύπο κατά τον καθορισμό της τιμής.
Κωδικός: |_+_| ΠΡΟΣ ΤΟ

επιχειρήσεις

28 Ιανουαρίου 2006
  • 27 Απριλίου 2018
ynstek είπε: Swift, δεν είναι σίγουρο ότι η τιμή σας είναι ακριβώς int. Υπάρχουν δύο επιλογές για να βεβαιωθείτε.
1) '!' μπορείτε να υποδείξετε ότι αυτή η τιμή θα είναι ακριβής, προσθέτοντας το σημάδι.
Κωδικός: |_+_| 2) Μπορείτε να καθορίσετε τον τύπο κατά τον καθορισμό της τιμής.
Κωδικός: |_+_|

Νομίζω ότι το #2 παράδειγμά σας θα αποτύχει επειδή προσπαθείτε να αντιστοιχίσετε μια συμβολοσειρά cast σε ένα double σε μια μεταβλητή Int. Επίσης, υποθέτετε ότι το MyValue δεν είναι μηδενικό, το οποίο θα μπορούσε να προκαλέσει σφάλμα χρόνου εκτέλεσης εάν είναι μηδενικό ή μη αριθμητικό.

Το νούμερο 1 παράδειγμα εξήγησής σας δεν είναι επίσης σωστή. Ένα θαυμαστικό δεν μετατρέπει μια τιμή σε Int. Ξετυλίγει την τιμή μιας προαιρετικής μεταβλητής. Στο παράδειγμά σας, θα καταλήξετε με μια τιμή Double, όχι μια Int, και μόνο εάν η MyValue δεν ήταν μηδενική ή μια μη αριθμητική τιμή.