Apa perbedaan antara let
dan var
dalam bahasa Swift Apple?
Dalam pemahaman saya, ini adalah bahasa yang dikompilasi tetapi tidak memeriksa jenis pada waktu kompilasi. Itu membuat saya bingung. Bagaimana kompiler mengetahui tentang kesalahan tipe? Jika kompiler tidak memeriksa jenisnya, bukankah itu masalah dengan lingkungan produksi?
Jawaban:
Kata
let
kunci mendefinisikan konstanta:Tidak
theAnswer
dapat diubah setelahnya. Inilah sebabnya mengapa apa punweak
tidak dapat ditulis menggunakanlet
. Mereka perlu berubah selama runtime dan Anda harus menggunakanvar
sebagai gantinya.The
var
mendefinisikan variabel biasa.Apa yang menarik:
Fitur aneh lainnya:
Kutipan Dari: Apple Inc. โBahasa Pemrograman Swift.โ iBooks. https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewBook?id=881256329
EDIT
Karena komentar meminta untuk menambahkan fakta lain ke jawabannya, mengubahnya menjadi jawaban wiki komunitas . Merasa bebas mengedit jawaban untuk membuatnya lebih baik.
sumber
auto ๐ถ๐ฎ = "dogcow";
bekerja di C ++ untuk dentang.if ๐ === ๐ { ๐ = โ ๏ธ }
:);)Menurut Buku Bahasa Pemrograman Swift
Keduanya
var
danlet
merupakan referensi , oleh karena itulet
merupakan referensi const . Menggunakan tipe fundamental tidak benar-benar menunjukkanlet
perbedaannyaconst
. Perbedaannya muncul ketika menggunakannya dengan instance kelas (tipe referensi):sumber
var
danlet
tidak ada hubungannya dengan apakah pengenal terikat adalah referensi atau tidak. Jika tipe adalahstruct
tipe, secara konseptual merupakan nilai. Jika jenisnya adalahclass
itu secara konseptual referensi dan referensi adalah konstan jikalet
digunakan. JikaCTest
struktur, tidak adaletTest
tugas Anda akan bekerja.struct
itu adalah jenis nilai, tidak ada yang konseptual tentang itu. Sama denganclass
tipe referensi. Saat memodifikasi jenis nilai, Anda membuat instance baru dari tipe ini. developer.apple.com/swift/blog/?id=10 Jadi jelas Anda tidak dapat mengubah bidang / propertilet
terikat ke tipe nilai.let
digunakan untuk mendefinisikan konstanta danvar
untuk mendefinisikan variabel.sumber
Mungkin lebih baik untuk menyatakan perbedaan ini dengan gagasan Mutability / Unmutability yang merupakan paradigma yang benar dari nilai-nilai dan contoh perubahan dalam ruang Objek yang lebih besar dari satu-satunya pengertian "konstan / variabel" biasa. Dan lebih jauh ini lebih dekat dengan pendekatan Objective C.
2 tipe data: tipe nilai dan tipe referensi.
Dalam konteks Jenis Nilai:
'let' mendefinisikan nilai konstan (tidak dapat dicapai). 'var' mendefinisikan nilai yang dapat diubah (bisa diubah).
Dalam konteks Jenis Referensi:
Label suatu data bukanlah nilai melainkan referensi ke suatu nilai.
if aPerson = Orang (nama: Foo, pertama: Bar)
aPerson tidak mengandung Data orang ini tetapi referensi ke data Orang ini.
sumber
aPerson
memiliki setter Anda dapat memodifikasi propertinya kan? sehinggalet
tidak membuat yangPerson
abadi.Itu
Mendeklarasikan Konstanta dan Variabel bagian dari dokumentasi Bahasa Swift Programming menentukan hal-hal berikut:
Pastikan Anda memahami cara kerjanya untuk tipe Referensi. Tidak seperti Jenis Nilai, properti yang mendasari objek dapat berubah meskipun turunan jenis referensi dinyatakan sebagai konstanta. Lihat bagian Kelas adalah Jenis Referensi dari dokumentasi, dan lihat contoh di mana mereka mengubah properti frameRate.
sumber
Sangat sederhana:
let
konstan.var
dinamis.Sedikit deskripsi:
let
menciptakan konstanta. (semacam anNSString
). Anda tidak dapat mengubah nilainya setelah Anda menetapkannya. Anda masih dapat menambahkannya ke hal lain dan membuat variabel baru.var
menciptakan variabel. (semacam sukaNSMutableString
) sehingga Anda dapat mengubah nilai itu. Tetapi ini sudah dijawab beberapa kali.sumber
let
mendefinisikan "konstan". Nilainya diatur sekali dan hanya sekali, meskipun tidak harus ketika Anda mendeklarasikannya. Misalnya, Anda menggunakanlet
untuk mendefinisikan properti di kelas yang harus ditetapkan selama inisialisasi:Dengan pengaturan ini, tidak sah untuk menetapkan
firstName
ataulastName
setelah memanggil (mis.)Person(first:"Malcolm", last:"Reynolds")
Untuk membuat aPerson
instance.Anda harus menentukan tipe untuk semua variabel (
let
atauvar
) pada waktu kompilasi, dan kode apa pun yang mencoba mengatur variabel hanya dapat menggunakan tipe itu (atau subtipe). Anda dapat menetapkan nilai pada waktu berjalan, tetapi jenisnya harus diketahui pada waktu kompilasi.sumber
let
-constant
var
-variable
[Konstan vs variabel]
[Struct vs Class]
Doc .swift.org resmi mengatakan
Terminologi ini sebenarnya menggambarkan mekanisme penugasan kembali
Mutabilitas - dapat diubah - status objek dapat diubah setelah pembuatan
Nilai dan Jenis Referensi [Tentang]
Nilai (Struct, Enum)
Swift's
struct
dapat mengubah status mutabilitas mereka:let
+struct
=immutable
= Konstan nilaiHal ini dapat tidak akan ditugaskan kembali atau diubah
var
+struct
=mutable
Ini dapat dipindahkan atau diubah
Tipe Referensi (Kelas)
Swift
classes
adalahmutable
a-prioratlet
+class
= konstanta alamatIni tidak dapat dipindahkan dan dapat diubah
var
+class
Ini dapat dipindahkan atau diubah
mutating
- Mutasi Fungsi StructAnda dapat menandai metode struct sebagai
mutating
var
+struct
inout
Memodifikasi struct di dalam suatu fungsiAnda dapat menandai parameter fungsi (yang merupakan struct) sebagai
inout
Karena
struct
tipe nilai, itu dilewatkan oleh nilai sebagai fungsi hasil akan mengambil salinan. Jika Anda menandaistruct
sebagaiinout
parameter, artinya parameter ini menjadivar
dan Anda dapat mengubah statusstruct
dan perubahan ini akan terlihat di luar lingkup fungsisumber
Satu lagi perbedaan, yang saya temui dalam bahasa lain untuk Konstanta adalah: tidak dapat menginisialisasi konstanta (biarkan) untuk nanti , harus diinisialisasi ketika Anda akan mendeklarasikan konstanta.
Misalnya :
Variabel
sumber
let
digunakan untuk mendeklarasikan nilai konstan - Anda tidak akan mengubahnya setelah memberinya nilai awal.var
digunakan untuk mendeklarasikan nilai variabel - Anda dapat mengubah nilainya sesuai keinginan.sumber
let digunakan untuk mendefinisikan konstanta dan var untuk mendefinisikan variabel. Anda mendefinisikan string menggunakan var maka String tertentu dapat dimodifikasi (atau bermutasi) dengan menetapkannya ke variabel (dalam hal ini dapat dimodifikasi), dan jika Anda mendefinisikan string menggunakan let konstannya (dalam hal ini tidak dapat diubah):
sumber
biarkan kata kunci mendefinisikan sebuah konstanta
jadi myNum tidak bisa diubah setelahnya;
Tetapi var mendefinisikan variabel biasa.
Nilai konstanta tidak perlu diketahui pada waktu kompilasi, tetapi Anda harus memberinya nilai tepat sekali.
Anda dapat menggunakan hampir semua karakter yang Anda suka untuk nama konstan dan variabel, termasuk karakter Unicode;
misalnya
Tetapi jika kita ambil biarkan ...
sumber
Seperti Luc-Oliver, NullData, dan beberapa orang lain katakan di sini,
let
mendefinisikan data yang tidak dapat diubah sementaravar
mendefinisikan data yang dapat diubah. Apa punfunc
yang dapat dipanggil pada variabel yang ditandaimutating
hanya dapat dipanggil jika itu adalahvar
variabel (kompiler akan melempar kesalahan). Ini juga berlaku untukfunc
yang menerimainout
variabel.Namun,
let
danvar
juga berarti bahwa variabel tidak dapat dipindahkan. Ini memiliki dua makna, keduanya dengan tujuan yang sangat miripsumber
nilai var dapat diubah, setelah diinisialisasi. Tapi biarkan nilai tidak diubah, ketika itu dimasukkan sekali.
Dalam hal var
Dalam kasus let
sumber
Kata kunci var digunakan untuk mendefinisikan variabel yang nilainya dapat Anda ubah dengan mudah seperti ini:
Namun, kata kunci let hanya untuk membuat konstanta yang digunakan ketika Anda tidak ingin mengubah nilai konstanta lagi. Jika Anda mencoba mengubah nilai konstanta, Anda akan mendapatkan kesalahan:
sumber
Membiarkan adalah variabel abadi, yang berarti bahwa itu tidak dapat diubah, bahasa lain menyebutnya konstan. Dalam C ++ Anda dapat mendefinisikannya sebagai const.
Var adalah variabel yang dapat berubah, yang berarti dapat diubah. Di C ++ (pembaruan versi 2011), ini sama dengan menggunakan otomatis, meskipun swift memungkinkan lebih banyak fleksibilitas dalam penggunaan. Ini adalah tipe variabel yang lebih terkenal untuk pemula.
sumber
biarkan adalah nilai konstan, jadi itu tidak pernah bisa diubah.
Var adalah variabel, dan dapat berubah (tetapi setelah itu didefinisikan bukan tipe data yang berbeda.)
Jika Anda mencoba mengubah variabel ke tipe data yang berbeda, itu tidak akan berfungsi
sumber
Perbedaan utama adalah bahwa
var
nilai variabel dapat berubah, danlet
tidak bisa. Jika Anda ingin memiliki data input pengguna, Anda akan menggunakanvar
sehingga nilainya dapat diubah dan menggunakanlet
variabel tipe data sehingga nilainya tidak dapat diubah.sumber
Nilai dapat dipindahkan jika ada var
** konstanta newAge tidak dapat dipindahkan ke nilai baru. Mencoba melakukannya akan memberikan kesalahan waktu kompilasi **
sumber
"Gunakan biarkan untuk membuat konstanta dan var untuk membuat variabel"
Excerpt From: Apple Inc. โThe Swift Programming Language.โ iBooks.
https://itun.es/us/jEUH0.lsumber
var adalah variabel yang dapat diubah sebanyak yang Anda inginkan dan kapan saja
sebagai contoh
membiarkan adalah konstan yang tidak dapat diubah
sebagai contoh
sumber
Meskipun Anda sudah mendapatkan banyak perbedaan antara let dan var tetapi satu perbedaan utama adalah:
sumber
Setiap orang telah menjawab ini, tetapi inilah cara Anda dapat mengingat apa itu
Biarkan akan selalu mengatakan pemikiran yang sama tentang "biarkan" seperti membiarkan ini bekerja untuk sekali dan selalu untuk variabel "var" selalu dapat berubah maka mereka disebut variabel
sumber
var
adalah satu-satunya cara untuk membuat variabel dengan cepat.var
tidak berarti variabel dinamis seperti dalam kasus bahasa yang ditafsirkan seperti javascript. Sebagai contoh,Dalam hal ini, tipe variabel
name
disimpulkan bahwa nama adalah tipeString
, kita juga dapat membuat variabel dengan tipe yang secara eksplisit mendefinisikan, misalnyaSekarang jika Anda menetapkan string ke umur, maka kompiler memberikan kesalahan.
let
digunakan untuk mendeklarasikan konstanta. Sebagai contohAtau bisa juga kita lakukan,
Jika Anda mencoba mengubah nilai kota, itu memberikan kesalahan pada waktu kompilasi.
sumber
let digunakan untuk konstanta yang tidak dapat dimodifikasi sementara var adalah variabel biasa
Contoh:
beri nama = "Bob" Sesuatu seperti nama = "Jim" akan menampilkan kesalahan karena konstanta tidak dapat dimodifikasi.
sumber
PERBEDAAN SEDERHANA
let = (tidak bisa diubah)
var = (pembaruan setiap saat)
sumber
Sumber: https://thenucleargeeks.com/2019/04/10/swift-let-vs-var/
Ketika Anda mendeklarasikan variabel dengan var, itu berarti ia dapat diperbarui, itu variabel, nilainya dapat diubah.
Ketika Anda mendeklarasikan variabel dengan let, itu berarti ia tidak dapat diperbarui, itu adalah variabel, nilainya tidak dapat dimodifikasi.
Mari kita pahami contoh di atas: Kami telah membuat variabel baru "a" dengan "var keyword" dan menetapkan nilai "1". Ketika saya mencetak "a" saya mendapatkan output sebagai 1. Kemudian saya menetapkan 2 ke "var a" yaitu saya mengubah nilai variabel "a". Saya bisa melakukannya tanpa mendapatkan kesalahan kompiler karena saya menyatakannya sebagai var.
Dalam skenario kedua saya membuat variabel baru "b" dengan "biarkan kata kunci" dan menetapkan nilai "4". Ketika saya mencetak "b" saya mendapat 4 sebagai output. Kemudian saya mencoba untuk menetapkan 5 ke "let b" yaitu saya mencoba untuk memodifikasi variabel "let" dan saya mendapatkan kesalahan waktu kompilasi "Tidak dapat menetapkan nilai: 'b' adalah konstanta 'biarkan'".
sumber
Meskipun saat ini saya masih membaca manual, tapi saya pikir ini sangat dekat dengan
const
pointer C / C ++ . Dengan kata lain, sesuatu seperti perbedaan antarachar const*
danchar*
. Compiler juga menolak untuk memperbarui konten, tidak hanya referensi penugasan kembali (pointer).Sebagai contoh, katakanlah Anda memiliki struct ini. Berhati-hatilah karena ini adalah struct, bukan kelas. AFAIK, kelas tidak memiliki konsep negara abadi.
Karena struct tidak dapat diubah secara default, Anda harus menandai metode mutator dengannya
mutating
. Dan karena namanyaaaa1
konstan, Anda tidak dapat memanggil metode mutator di dalamnya. Inilah yang kami harapkan pada pointer C / C ++.Saya percaya ini adalah mekanisme untuk mendukung semacam hal yang benar-benar benar .
sumber
Nyatakan konstanta dengan kata kunci let dan variabel dengan kata kunci var.
Deklarasikan beberapa konstanta atau banyak variabel pada satu baris, dipisahkan dengan koma:
Mencetak Konstanta dan Variabel
Anda dapat mencetak nilai konstanta atau variabel saat ini dengan fungsi println:
Swift menggunakan interpolasi string untuk memasukkan nama konstanta atau variabel sebagai pengganti di string yang lebih panjang
Bungkus nama dalam tanda kurung dan lepas dengan backslash sebelum tanda kurung buka:
Referensi: http://iosswift.com.au/?p=17
sumber
Ditemukan jawaban yang bagus semoga bisa membantu :)
sumber
let
tidak berarti bahwa objek tidak dapat diubah, itu berarti pointer tidak dapat diubah. Untuk mendapatkan fungsionalitas yang setara di Obj-C Anda perlu menggunakanNSObject *const myObject = someobject;
- Properti dari objek tersebut dapat dimodifikasi, tetapi pointermyObject
tidak dapat dimodifikasi untuk menunjuk ke objek lain.const pointer
yang tidak dapat berubah di masa depan tapi nilainya bisa. Anda tidak dapat menginisialisasi ulang tetapi dapat menggunakannya seperti yang Anda inginkan.