Forum

Operator Mac Binary „>” nie może być zastosowany do operandów typu „Double?” i „Wew.”

abcdefg12345

Oryginalny plakat
10 lipca 2013 r.
  • 21 paź 2017
Próbuję mieć instrukcję if, aby sprawdzić, czy podwójna wartość w ciągu jest większa niż 10, ale zależy mi na błędzie „Operator binarny „>” nie może być zastosowany do operandów typu „Double?” i „Int” każdy wie, co robię źle.

szybki 4
Kod: |__+_|
używam zmiennej ciąg, ponieważ potrzebuję, aby była ciągiem, abym mógł go później sformatować, zdefiniowałem go jako
Kod: |__+_|

abcdefg12345

Oryginalny plakat
10 lipca 2013 r.


  • 21 paź 2017
naprawiono to, dodając kolejną zmienną
Kod: |__+_|
Reakcje:960projekt

0002378

Zawieszony
28 maja 2017 r.
  • 23 paź 2017
Myślę, że język Swift jest czasami dość śmieszny, zwł. pochodzące z programowania w Javie. I przywołałeś jeden z najlepszych przykładów.

I chociaż opcje mają swoje zalety, sprawiają również, że chcę rozbić komputer o górne krawędzie śmietnika.

Jednak tam, gdzie Swift naprawdę skopuje tyłek, jest wydział zamknięć ... o tak! Java też je ma teraz, ale ...

No i oczywiście fakt, że Swift jest mniej rygorystyczny w deklaracji typów i te nieznośne średniki… super!

Reakcje:abcdefg12345

0002378

Zawieszony
28 maja 2017 r.
  • 24 paź 2017
Och czekaj, teraz, gdy patrzę wstecz na twój kod, widzę, że twoja wartość Double(string) jest równa Double?, która jest wartością opcjonalną.

Nie potrzebujesz nowej zmiennej. Możesz po prostu dodać „!” do twojego Double (string) i zadziała.

Chyba się myliłem, że Swift był w tym przypadku głupi. Ale spotkałem się z wieloma przypadkami takich skarg na kompilator (nie można porównać dwóch różnych typów liczbowych).

Greene

15 lipca 2015 r.
Fort Wart
  • 24 paź 2017
Myślę, że czystszym, bardziej Swifty rozwiązaniem byłoby przechowywanie Twojej MyValue jako podwójnej lub int (co wydaje się być). Następnie możesz użyć NumberFormatter do obsługi formatowania.

Możesz też użyć opcjonalnego wiązania, aby rozpakować wartość. Wypróbowałbym jedną z tych metod przed użyciem siły odwijania

zgrzytacz729

Zawieszony
25 listopada 2005
  • 24 paź 2017
maculateConception powiedział: Myślę, że Swift, jako język, jest czasami dość śmieszny, zwł. pochodzące z programowania w Javie. I przywołałeś jeden z najlepszych przykładów.
To jest zupełnie bezsensowne. Problem polega na tym, że OP nie wie o podstawowej funkcji Swift, czyli o wartościach opcjonalnych. Konstruktor Double(String) może oczywiście zawieść, jeśli String nie zawiera liczby. Dlatego Double (String) nie daje i nie może generować wyniku typu Double, ale jednego typu Double? , czyli opcjonalny Double. A opcjonalny Double nie może być porównywany z Int.

Twoje „rozwiązanie” jest naprawdę okropne. Ten ! oznacza „Jestem pewien, że to nawrócenie się powiedzie. Jeśli tak się nie stanie, awarię aplikacji”. niech d = Podwójne ('1234x')! po prostu się zawiesi. Celowo. Ponieważ nie sprawdziłeś zero, a to było zero.

Prawidłowym sposobem jest sprawdzenie błędu. Na przykład

jeśli niech d = Double (MyValue), d > 10 {
// MojaWartość zawierała liczbę, a liczba ta jest > 10.
} w przeciwnym razie {
// MojaWartość nie zawierała liczby lub była<= 10.
}

Jeśli uważasz, że warto pisać kod, który jest bezpieczny i faktycznie działa, to Swift jest właściwym językiem.
Reakcje:atenterprises i ajthom90

0002378

Zawieszony
28 maja 2017 r.
  • 24 paź 2017
gnasher729 powiedział: To nie ma pojęcia. Problem polega na tym, że OP nie wie o podstawowej funkcji Swift, czyli o wartościach opcjonalnych. Konstruktor Double(String) może oczywiście zawieść, jeśli String nie zawiera liczby. Dlatego Double (String) nie daje i nie może generować wyniku typu Double, ale jednego typu Double? , czyli opcjonalny Double. A opcjonalny Double nie może być porównywany z Int.

Czy byłeś zastraszany w szkole? Wygląda na to, że masz dość niską samoocenę, ponieważ nie mogłeś odpowiedzieć bez atakowania mnie.

To będzie moja pierwsza i ostatnia wiadomość do Ciebie. Propozycja dla Ciebie - spróbuj komunikować się w bardziej cywilny sposób, a życie będzie wspaniałe. Trzymaj się.

Greene

15 lipca 2015 r.
Fort Wart
  • 25 paź 2017
gnasher729 powiedział: Prawidłowym sposobem jest sprawdzenie błędu. Na przykład

jeśli niech d = Double (MyValue), d > 10 {
// MojaWartość zawierała liczbę, a liczba ta jest > 10.
} w przeciwnym razie {
// MojaWartość nie zawierała liczby lub była<= 10.
}

To jest niejednoznaczne - co jeśli wartość jest<= 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 wiele czystszy sposób byłby:

Kod: |__+_|
Chociaż naprawdę uważam, że MyValue powinna być przechowywana jako Double od samego początku, a NumberFormatter zaimplementowany później, aby obsłużyć wszelkie potrzebne formatowanie. Ma to znacznie mniejsze obciążenie poznawcze dla każdego, kto przeczyta kod.
Reakcje:w przedsiębiorstwach

zgrzytacz729

Zawieszony
25 listopada 2005
  • 26 paź 2017
maculateConception powiedział: Czy byłeś zastraszany w szkole? Wygląda na to, że masz dość niską samoocenę, ponieważ nie mogłeś odpowiedzieć bez atakowania mnie.

To będzie moja pierwsza i ostatnia wiadomość do Ciebie. Propozycja dla Ciebie - spróbuj komunikować się w bardziej cywilny sposób, a życie będzie wspaniałe. Trzymaj się.

Cóż, nie zaatakowałem cię. Zaatakowałem Twój post, który pokazuje, że niewiele wiesz o Swifcie, i zawierał jedną bardzo niebezpieczną rekomendację. S

SAIRUS

do
21 sierpnia 2008
  • 26 paź 2017
Strzeżę większości razy, ale jeśli każda z funkcji w klasie strzeże tej samej zmiennej... może chcieć ponownie rozważyć swój początkowy interfejs.

wstawić

14 kwi 2018
  • 14 kwi 2018
Swift, nie jest pewien, czy twoja wartość jest dokładnie int. Istnieją dwie opcje, aby się upewnić.
1) '!' możesz wskazać, że ta wartość będzie dokładna int, dodając znak.
Kod: |__+_| 2) Możesz określić typ podczas definiowania wartości.
Kod: |__+_| DO

w przedsiębiorstwach

28 stycznia 2006
  • 27 kwi 2018
ynstek powiedział: Swift, nie jesteś pewien, czy twoja wartość jest dokładnie int. Istnieją dwie opcje, aby się upewnić.
1) '!' możesz wskazać, że ta wartość będzie dokładna int, dodając znak.
Kod: |__+_| 2) Możesz określić typ podczas definiowania wartości.
Kod: |__+_|

Myślę, że Twój przykład nr 2 nie powiedzie się, ponieważ próbujesz przypisać rzut do podwójnego ciągu do zmiennej Int. Zakładasz również, że MyValue nie jest zero, co może spowodować błąd w czasie wykonywania, jeśli będzie zerowa lub nienumeryczna.

Twoje przykładowe wyjaśnienie nr 1 również nie jest właściwe. Wykrzyknik nie konwertuje wartości na Int. Rozpakowuje wartość zmiennej opcjonalnej. W twoim przykładzie otrzymasz wartość Double, a nie Int, i tylko wtedy, gdy MyValue nie będzie zero lub wartość nienumeryczna.