Dikkat: layman'ın şartları önde.
Bu açıklama, en nitty-cesur kod düzeyinde kesinlikle doğru değildir. Ancak, Swift üzerinde çalışan bir adam tarafından incelendi ve temel bir açıklama olarak yeterince iyi olduğunu söyledi.
Bu yüzden "neden" sorusuna basitçe ve doğrudan cevap vermeye çalışmak istiyorum .
Kesin olmak gerekirse: neden struct işlevlerini mutating
anahtar sözcükleri değiştirmeden yapı parametrelerini değiştirebileceğimiz zamanki gibi işaretlememiz gerekiyor ?
Yani, büyük resmin Swift'i hızlı tutan felsefeyle çok ilgisi var .
Bunu gerçek fiziksel adresleri yönetme sorunu gibi düşünebilirsiniz. Adresinizi değiştirdiğinizde, mevcut adresinize sahip çok sayıda insan varsa, hepsini taşındığınızı bildirmeniz gerekir. Ancak, kimse mevcut adresinize sahip değilse, istediğiniz yere gidebilirsiniz ve kimsenin bilmesi gerekmez.
Bu durumda Swift bir nevi postane gibidir. Çok sayıda kişiyle çok sayıda insan çok hareket ederse, bu gerçekten yüksek bir ek yüke sahiptir. Tüm bu bildirimleri ele almak için büyük bir personele ödeme yapması gerekiyor ve süreç çok zaman ve çaba gerektiriyor. İşte bu yüzden Swift'in ideal durumu, kasabasındaki herkesin olabildiğince az bağlantıya sahip olmasıdır. O zaman adres değişikliklerini ele almak için büyük bir kadroya ihtiyaç duymaz ve diğer her şeyi daha hızlı ve daha iyi yapabilir.
Swift halkının referans türlerine karşı değer türleri hakkında öfkelenmesinin nedeni de budur. Doğası gereği, referans türleri her yerde "kişileri" toplar ve değer türleri genellikle birkaç taneden fazlasına ihtiyaç duymaz. Değer türleri "Swift" dir.
Küçük resme geri So: structs
. Yapılar, Swift'de önemli bir konudur çünkü nesnelerin yapabileceği şeylerin çoğunu yapabilirler, ancak değer türleridir.
Fiziksel adres benzetmesine misterStruct
içinde yaşayan bir hayal ederek devam edelim someObjectVille
. Analoji burada biraz yanıltıcı olsa da yine de yardımcı olduğunu düşünüyorum.
Öyleyse, bir değişkeni değiştirmeyi modellemek için struct
, diyelim ki misterStruct
yeşil saç var ve mavi saça geçme emri alıyor. Benzetme, dediğim gibi çıldırıyor, ama olan şu ki misterStruct
, saçını değiştirmek yerine , yaşlı kişi dışarı çıkıyor ve mavi saçlı yeni bir kişi içeri giriyor ve bu yeni kişi kendini aramaya başlıyor misterStruct
. Kimsenin adres değişikliği bildirimi almasına gerek yoktur, ancak biri bu adrese bakarsa mavi saçlı bir adam görür.
Şimdi, a'da bir işlevi çağırdığınızda ne olacağını modelleyelim struct
. Bu durumda, gibi misterStruct
bir emir alır gibi changeYourHairBlue()
. Bu yüzden postane misterStruct
"gidip saçını maviye çevir ve işin bittiğinde bana söyle" talimatını veriyor .
Daha önce olduğu gibi aynı rutini takip ediyorsa, doğrudan değişken değiştirildiğinde yaptığı şeyi yapıyorsa misterStruct
, yapacağı şey kendi evinden çıkıp mavi saçlı yeni bir insanı aramaktır. Ama sorun bu.
Emir "git saçını maviye değiştir ve işin bittiğinde bana söyle" idi, ama bu emri alan yeşil adam. Mavi adam eve taşındıktan sonra, "iş tamamlandı" bildiriminin yine de geri gönderilmesi gerekiyor. Ama mavi adam bunun hakkında hiçbir şey bilmiyor.
[Bu benzetmeyi gerçekten uyandırmak için korkunç bir şey, teknik olarak yeşil saçlı adama olan şey, taşındıktan sonra hemen intihar etmesiydi. Yani o kimseyi haberdar olamaz görev tam olduğunu ya! ]
Bu sorundan kaçınmak için , yalnızca bu gibi durumlarda , Swift doğrudan o adresteki eve gitmeli ve aslında mevcut sakinlerinin saçını değiştirmelidir . Bu, yeni bir adam göndermekten tamamen farklı bir süreç.
İşte bu yüzden Swift mutating
anahtar kelimeyi kullanmamızı istiyor !
Sonuç, yapıya atıfta bulunmak zorunda olan her şeye aynı görünüyor: evin sakini artık mavi saçlara sahip. Ancak bunu başarma süreçleri aslında tamamen farklıdır. Aynı şeyi yapıyor gibi görünüyor, ama çok farklı bir şey yapıyor. Swift yapısının genel olarak asla yapmadığı bir şeyi yapıyor .
Bu nedenle, zayıf derleyiciye biraz yardım etmek ve bir işlevin şimdiye kadarki her yapı işlevi içinstruct
kendi başına değişip değişmediğini anlamak zorunda kalmamak için acımamız ve mutating
anahtar sözcüğü kullanmamız istenir .
Esasen, Swift'in hızlı kalmasına yardımcı olmak için hepimiz üzerimize düşeni yapmalıyız. :)