Saya melihat catatan Xcode 7.3 dan saya perhatikan masalah ini.
Operator ++ dan - telah ditinggalkan
Bisakah seseorang menjelaskan mengapa itu usang? Dan apakah saya benar bahwa dalam versi Xcode baru sekarang Anda akan menggunakan bukan ++
ini x += 1
;
Contoh:
for var index = 0; index < 3; index += 1 {
print("index is \(index)")
}
++
dan--
operatorJawaban:
Sebuah penjelasan lengkap di sini dari Chris Lattner, pencipta Swift. Saya akan merangkum poin-poinnya:
x += 1
for i = 0; i < n; i++ { ... }
:, yang Swift memiliki alternatif yang lebih baik, sepertifor i in 0..<n { ... }
(C-style untuk loop juga akan keluar )x - ++x
ataufoo(++x, x++)
?Bagi mereka yang tertarik (dan untuk menghindari pembusukan tautan), alasan Lattner dalam kata-katanya sendiri adalah:
sumber
++
tidak ada dalam bahasa C-style, tidak ada yang waras akan melihat desain Swift 3.0 dan berpikir bahwa++
operator akan menjadi tambahan yang bagus untuk itu.Saya menyadari bahwa komentar ini tidak menjawab pertanyaan, namun mungkin ada orang yang mencari solusi bagaimana menjaga operator ini bekerja dan solusi seperti itu dapat ditemukan di bagian bawah. 😇
Saya pribadi lebih suka
++
dan--
operator. Saya tidak setuju dengan pendapat bahwa mereka rumit atau sulit dikelola. Setelah pengembang memahami apa yang dilakukan operator ini (dan kami berbicara tentang hal-hal yang cukup sederhana) kode tersebut harus sangat jelas.Dalam penjelasan mengapa operator tidak digunakan disebutkan bahwa penggunaan utama mereka adalah dalam gaya C untuk loop. Saya tidak tahu tentang orang lain tetapi saya pribadi tidak menggunakan loop gaya C sama sekali dan masih ada banyak tempat atau situasi lain ketika
++
atau--
operator berguna.Saya juga ingin menyebutkan bahwa
varName++
mengembalikan nilai sehingga dapat digunakanreturn
sementaravarName += 1
tidak bisa.Bagi Anda yang ingin menjaga agar operator ini tetap bekerja di sini adalah solusinya:
sumber
return (x - 1)
untuk operator postfix - IMHO lebih bersih untuk menjaga semantik bahwa mereka mengembalikan (salinan) nilai asli daripada apa yang Anda dapatkan jika Anda melakukannyax + 1 - 1
Int
hanya maka hasil(x + 1)
akan meluap yang akan mengganggu eksekusi dan karenanyaresult - 1
tidak akan dijalankan. Tipe data lain sepertiDouble
misalnya, berperilaku namun berbeda sehingga saya perlu menyelidiki itu.defer
ini juga.defer { x += 1 }; return x
Apple telah menghapus
++
dan membuatnya lebih sederhana dengan cara tradisional lama lainnya.Alih-alih
++
, Anda perlu menulis+=
.Contoh:
Demikian pula untuk operator pengurangan
--
, Anda perlu menulis-=
Contoh:
Untuk
for
loop:Contoh Penambahan:
Dari pada
Kamu bisa menulis:
Contoh Pengurangan:
Kamu bisa menulis:
Semoga ini membantu!
sumber
+=
ada di sana selama ini.++i
dan--i
?Chris Lattner telah berperang melawan ++ dan -. Dia menulis, “Kode yang benar-benar menggunakan nilai hasil dari operator ini seringkali membingungkan dan halus bagi pembaca / pemelihara kode. Mereka mendorong kode "terlalu rumit" yang mungkin lucu, tetapi sulit dimengerti .... Sementara Swift memiliki urutan evaluasi yang jelas, kode apa pun yang bergantung padanya (seperti foo (++ a, a ++)) tidak akan diinginkan walaupun didefinisikan dengan baik ... ini gagal metrik "jika kita belum memiliki ini, apakah kita akan menambahkannya ke Swift 3?"
Apple ingin tetap menggunakan bahasa yang bersih, jelas, tidak membingungkan, dan langsung ke sasaran. Jadi mereka tidak lagi menggunakan ++ dan - kata kunci.
sumber
...for i in 0.stride(to: 10, by: 2)...
atau...for i in (1...10).reverse()...
bersih ?!The
Fix-it feature
Xcode memberikan jawaban yang jelas untuk ini.Ganti
++ increment operator
dengan yang lamavalue += 1
(operator tangan pendek) dan-- decrement operator
denganvalue -= 1
sumber
Untuk Swift 4, Anda dapat memulihkan
++
dan--
operator sebagai ekstensi untukInt
dan jenis lainnya. Berikut ini sebuah contoh:Ia bekerja dengan cara yang sama untuk jenis lain, seperti
UIInt
,Int8
,Float
,Double
, dllAnda dapat menempelkan ekstensi ini dalam satu file di direktori root Anda, dan ekstensi itu akan tersedia untuk digunakan di dalam semua file Anda yang lain di sana.
Saya telah memperhatikan beberapa suara untuk jawaban saya di sini, segera setelah saya mempostingnya. Yang saya anggap sebagai perselisihan filosofis, bukan kritik tentang cara kerja kode saya. Ini berfungsi dengan baik, jika Anda memeriksanya di taman bermain.
Alasan mengapa saya memposting jawaban ini adalah karena saya tidak setuju dengan membuat bahasa pemrograman komputer yang tidak perlu berbeda satu sama lain.
Memiliki banyak kesamaan antar bahasa membuatnya lebih mudah bagi orang untuk belajar dan beralih dari satu bahasa ke bahasa lain.
Pengembang biasanya menggunakan beberapa bahasa pemrograman, bukan hanya satu. Dan sungguh merepotkan untuk beralih dari satu bahasa ke bahasa lain, ketika tidak ada konvensi dan tidak ada standardisasi umum lintas bahasa.
Saya percaya bahwa harus ada perbedaan sintaks antara bahasa hanya sebanyak yang diperlukan, dan tidak lebih dari ini.
sumber
Ini adalah versi umum dari beberapa kode yang diposting sejauh ini. Saya akan menyuarakan keprihatinan yang sama dengan yang lain: ini adalah praktik terbaik untuk tidak menggunakannya di Swift. Saya setuju bahwa ini dapat membingungkan bagi mereka yang membaca kode Anda di masa depan.
Ini juga dapat ditulis sebagai ekstensi pada tipe Numerik.
sumber
@discardableResult
ke masing-masing fungsi ini untuk membungkam peringatan tentang nilai kembali yang tidak digunakan; jika tidak tepat apa yang saya cari.Dari dokumen :
sumber
Ini jelas merupakan kerugian, bukan?
sumber
Karena Anda tidak pernah benar-benar bekerja dengan pointer di Swift, masuk akal untuk menghapus
++
dan--
operator menurut saya. Namun jika Anda tidak dapat hidup tanpanya, Anda dapat menambahkan deklarasi operator Swift 5+ ini ke proyek Anda:sumber
Dalam Swift 4.1 itu bisa dicapai dengan cara ini:
Perhatikan bahwa terlepas dari kenyataan bahwa solusi ini mirip dengan solusi sebelumnya dalam posting ini, mereka tidak berfungsi lagi di Swift 4.1 dan contoh ini tidak. Juga perhatikan bahwa siapa pun di atas yang menyebutkan bahwa + = adalah pengganti ++ hanya tidak sepenuhnya memahami operator karena ++ digabungkan dengan penugasan sebenarnya adalah dua operasi, karenanya jalan pintas. Dalam contoh saya:
var s = t++
melakukan dua hal: tetapkan nilai t ke s dan kemudian kenaikan t. Jika ++ datang sebelumnya, ini adalah dua operasi yang sama dilakukan dalam urutan terbalik. Menurut pendapat saya, alasan Apple tentang mengapa harus menghapus operator ini (disebutkan dalam jawaban sebelumnya), bukan hanya alasan palsu tetapi lebih lanjut saya percaya itu bohong dan alasan sebenarnya adalah bahwa mereka tidak dapat membuat kompiler mereka menanganinya. Itu memberi mereka masalah di versi sebelumnya sehingga mereka menyerah. Logika "operator yang terlalu rumit untuk dipahami, maka dihilangkan" jelas merupakan kebohongan karena Swift mengandung operator yang jauh lebih rumit dan jauh lebih tidak berguna yang tidak dihapus. Juga, sebagian besar bahasa pemrograman memilikinya. JavaScript, C, C #, Java, C ++ dan banyak lagi. Pemrogram dengan senang hati menggunakannya. Siapa pun yang terlalu sulit untuk memahami operator ini untuk,Strategi di belakang Swift sederhana: Apple percaya programmer itu bodoh dan karenanya harus diperlakukan sesuai.
Yang benar adalah bahwa Swift, yang diluncurkan pada September 2014 seharusnya sudah berada di tempat lain sekarang. Bahasa lain tumbuh lebih cepat.
Saya dapat membuat daftar banyak kesalahan besar dalam bahasa, dari yang serius: seperti array yang disisipkan oleh nilai dan bukan dengan referensi, ke yang menjengkelkan: fungsi parameter variadic tidak dapat menerima array yang merupakan keseluruhan ide di baliknya. Saya tidak berpikir bahwa karyawan Apple bahkan diizinkan untuk melihat bahasa lain seperti Java sehingga mereka bahkan tidak tahu bahwa Apple berada di belakang. Apple bisa saja mengadopsi Jawa sebagai bahasa tetapi belakangan ini, tantangan bukanlah teknologi, tetapi ego. Jika mereka akan membuka IntelliJ untuk menulis beberapa Java, mereka pasti akan menutup pemahaman bisnis mereka bahwa pada titik ini, mereka tidak bisa dan tidak akan pernah bisa mengejar ketinggalan.
sumber