Patrzę na notatki Xcode 7.3 i zauważam ten problem.
Operatory ++ i - zostały wycofane
Czy ktoś mógłby wyjaśnić, dlaczego jest przestarzały? I mam rację, że w nowej wersji Xcode teraz użyjesz zamiast ++
tego x += 1
;
Przykład:
for var index = 0; index < 3; index += 1 {
print("index is \(index)")
}
++
i--
Odpowiedzi:
Pełne wyjaśnienie tutaj z Chrisem Lattner, twórca Swifta. Podsumuję punkty:
x += 1
for i = 0; i < n; i++ { ... }
który Swift ma lepsze alternatywy, na przykładfor i in 0..<n { ... }
(pojawia się również pętla for w stylu C )x - ++x
lubfoo(++x, x++)
?Dla zainteresowanych (i dla uniknięcia zgnilizny linków) Lattner ma następujące powody:
źródło
++
nie było w językach C, nikt przy zdrowych zmysłach nie spojrzałby na projekt Swift 3.0 i nie pomyślałby, że++
operator byłby miłym dodatkiem do niego.Zdaję sobie sprawę, że ten komentarz nie odpowiada na pytanie, ale mogą być osoby szukające rozwiązania, jak utrzymać pracę tych operatorów i takie rozwiązanie można znaleźć na dole. 😇
Osobiście wolę
++
i--
operatorów. Nie mogę zgodzić się z opinią, że są trudne lub trudne w zarządzaniu. Gdy programista zrozumie, co robią te operatory (i mówimy o całkiem prostych rzeczach), kod powinien być bardzo przejrzysty.W wyjaśnieniu, dlaczego operatory zostały uznane za przestarzałe, wspomniano, że ich głównym zastosowaniem było pętle w stylu C. Nie wiem o innych, ale osobiście w ogóle nie używam pętli w stylu C i jest jeszcze wiele innych miejsc lub sytuacji, w których operator
++
lub--
jest przydatny.Chciałbym również wspomnieć, że
varName++
zwraca wartość, więc może być używany w przypadku,return
gdyvarName += 1
nie można.Dla każdego, kto chciałby, aby ci operatorzy pracowali tutaj, jest rozwiązaniem:
źródło
return (x - 1)
dla operatorów postfiksowych - IMHO jest czystsze, aby zachować semantykę, którą zwracają (kopię) oryginalnej wartości, zamiast tego, co otrzymasz, jeśli to zrobiszx + 1 - 1
Int
tylko o tym, wynik(x + 1)
zostanie przepełniony, co przerwie wykonywanie, a tym samymresult - 1
nie zostanie nawet uruchomiony. Inne typy danych, jakDouble
na przykład, zachowują się jednak inaczej, więc muszę to zbadać.defer
do tego użyć .defer { x += 1 }; return x
Firma Apple usunęła
++
i uprościła ją w inny stary tradycyjny sposób.Zamiast tego
++
musisz pisać+=
.Przykład:
Podobnie dla operatora dekrementacji
--
, musisz pisać-=
Przykład:
W przypadku
for
pętli:Przykład przyrostu:
Zamiast
Możesz pisać:
Przykład zmniejszenia:
Możesz pisać:
Mam nadzieję że to pomoże!
źródło
+=
był tam przez cały czas.++i
i--i
?Chris Lattner wyruszył na wojnę przeciwko ++ i -. Pisze: „Kod, który faktycznie wykorzystuje wartość wynikową tych operatorów, jest często zagmatwany i subtelny dla czytelnika / opiekuna kodu. Zachęcają do „zbyt skomplikowanego” kodu, który może być uroczy, ale trudny do zrozumienia… Chociaż Swift ma dobrze zdefiniowaną kolejność oceniania, każdy kod, który od niego zależy (jak foo (++ a, a ++)) byłby niepożądany, nawet jeśli był dobrze zdefiniowany… te nie spełniają kryterium „gdybyśmy ich jeszcze nie mieli, czy dodalibyśmy je do Swift 3?” ”
Firma Apple chciała zachować przejrzysty, przejrzysty, niezrozumiały i bezpośredni język. Dlatego wycofali słowa kluczowe ++ i -.
źródło
...for i in 0.stride(to: 10, by: 2)...
czy...for i in (1...10).reverse()...
jest czyste ?!Fix-it feature
Z Xcode daje jasnej odpowiedzi na to.Wymienić
++ increment operator
z old-fashionedvalue += 1
(operator krótki ręki) i-- decrement operator
zevalue -= 1
źródło
W przypadku Swift 4 można przywrócić operatory
++
i--
jako rozszerzenia dlaInt
i innych typów. Oto przykład:To działa w ten sam sposób do innych typów, takich jak
UIInt
,Int8
,Float
,Double
, etc.Możesz wkleić te rozszerzenia w jednym pliku w katalogu głównym i będą one dostępne do użytku we wszystkich innych plikach.
Zauważyłem tutaj kilka głosów negatywnych na moją odpowiedź, prawie natychmiast po jej opublikowaniu. Które traktuję jako filozoficzną niezgodę, a nie krytykę tego, jak działa mój kod. Działa idealnie, jeśli sprawdzisz to na placu zabaw.
Powodem, dla którego zamieściłem tę odpowiedź, jest to, że nie zgadzam się z tym, aby języki programowania komputerów niepotrzebnie różniły się od siebie.
Wiele podobieństw między językami ułatwia ich naukę i przechodzenie z jednego języka na inny.
Programiści zwykle używają kilku języków programowania, a nie tylko jednego. A przejście z jednego języka na inny jest prawdziwym kłopotem, gdy nie ma konwencji ani wspólnej standaryzacji we wszystkich językach.
Uważam, że różnice składniowe między językami powinny być tylko w takim stopniu, w jakim jest to konieczne, i nie więcej niż to.
źródło
Oto ogólna wersja niektórych dotychczas opublikowanych kodów. Chciałbym wyrazić te same obawy, co inni: najlepszą praktyką jest nie używać ich w Swift. Zgadzam się, że może to być mylące dla osób czytających Twój kod w przyszłości.
Można to również zapisać jako rozszerzenie typu numerycznego.
źródło
@discardableResult
do każdej z tych funkcji, aby wyciszyć ostrzeżenie o nieużywanej wartości zwracanej; w przeciwnym razie dokładnie to, czego szukałem.Z dokumentów :
źródło
To zdecydowanie wada, prawda?
źródło
Ponieważ w Swift nigdy nie pracujesz ze wskaźnikami, moim zdaniem ma sens usunięcie operatorów
++
i--
. Jeśli jednak nie możesz żyć bez, możesz dodać te deklaracje operatora Swift 5+ do swojego projektu:źródło
W Swift 4.1 można to osiągnąć w następujący sposób:
Zauważ, że pomimo tego, że to rozwiązanie jest podobne do poprzednich rozwiązań w tym poście, nie działają one już w Swift 4.1 i ten przykład działa. Zauważ również, że ktokolwiek powyżej wspomina, że + = jest zamiennikiem dla ++, po prostu nie w pełni rozumie operator, ponieważ ++ w połączeniu z przypisaniem to w rzeczywistości dwie operacje, stąd skrót. W moim przykładzie:
var s = t++
robi dwie rzeczy: przypisuje wartość t do s, a następnie zwiększa t. Jeśli ++ występuje wcześniej, to te same dwie operacje wykonane w odwrotnej kolejności. Moim zdaniem rozumowanie Apple dotyczące tego, dlaczego usunąć tego operatora (wspomniane w poprzednich odpowiedziach), jest nie tylko fałszywym rozumowaniem, ale ponadto uważam, że to kłamstwo, a prawdziwym powodem jest to, że nie mogli zmusić kompilatora do tego. W poprzednich wersjach sprawiało im to kłopoty, więc zrezygnowali. Logika „operatora zbyt skomplikowanego, aby go zrozumieć, stąd usunięta” jest oczywiście kłamstwem, ponieważ język Swift zawiera operatory o wiele bardziej skomplikowane i znacznie mniej przydatne, których nie usunięto. Posiada go również ogromna większość języków programowania. JavaScript, C, C #, Java, C ++ i wiele innych. Programiści chętnie z niego korzystają. Komu trudno jest zrozumieć tego operatora,Strategia Swift jest prosta: Apple uważa, że programista jest głupi i dlatego powinien być odpowiednio traktowany.
Prawda jest taka, że Swift, uruchomiony we wrześniu 2014 r., Miał już być gdzie indziej. Inne języki rosły znacznie szybciej.
Mogę wymienić wiele głównych błędów w języku, od poważnych: takich jak tablice wklejane według wartości, a nie przez odniesienie, po irytujące: funkcje z parametrami zmiennymi nie mogą zaakceptować tablicy, która jest podstawą jej działania. Nie sądzę, aby pracownicy Apple'a mogli nawet patrzeć na inne języki, takie jak Java, więc nawet nie wiedzą, że Apple jest o lata świetlne w tyle. Apple mogło przyjąć Javę jako język, ale obecnie wyzwaniem nie jest technologia, ale ego. Gdyby otworzyli IntelliJ, aby napisać trochę Javy, z pewnością zamknęliby swoje biznesowe zrozumienie, że w tym momencie nie mogą i nigdy nie nadrobią zaległości.
źródło