Swift sınırlarındaki Şey Türleri
Kural şudur:
Sınıf örnekleri başvuru türleridir (yani , bir sınıf örneğine başvurunuz etkili bir şekilde bir göstericidir )
Fonksiyonlar referans türleridir
Diğer her şey bir değer türüdür ; "diğer her şey" kısaca yapı örnekleri ve numaralandırma örnekleri anlamına gelir, çünkü Swift'de tüm olan budur. Örneğin, diziler ve dizeler yapı örnekleridir. Sen edebilirsiniz kullanarak (bir işlev bağımsız değişken olarak) bunlardan birinin başvuru geçmesi inout
newacct işaret ettiği gibi, adres ve çekici. Ancak türün kendisi bir değer türüdür.
Sizin İçin Referans Türleri Ne Anlama Geliyor?
Başvuru türü nesne pratikte özeldir çünkü:
Yalnızca atama veya işleve geçiş, aynı nesneye birden fazla referans verebilir
Nesnenin kendisi, kendisine yapılan referans bir sabit ( let
açık veya zımni) olsa bile değiştirilebilir .
Nesneye yapılan bir mutasyon, nesneye yapılan tüm referanslarda görüldüğü şekliyle nesneyi etkiler.
Bunlar tehlike olabilir, bu yüzden gözünüzü dört açın. Öte yandan, bir referans türünü iletmek açıkça etkilidir çünkü yalnızca bir işaretçi kopyalanır ve iletilir ki bu önemsizdir.
Sizin İçin Değer Türleri Ne Anlama Geliyor?
Açıkça, bir değer türü geçirmek "daha güvenlidir" ve let
söylediği anlamına gelir: Bir yapı örneğini veya bir let
referans aracılığıyla bir numaralandırma örneğini değiştiremezsiniz . Öte yandan, bu güvenlik değerin ayrı bir kopyasını çıkarmakla sağlanıyor, değil mi? Bu, bir değer türünü geçirmeyi potansiyel olarak pahalı hale getirmez mi?
Hem evet hem hayır. Düşündüğün kadar kötü değil. Nate Cook'un dediği gibi, bir değer türünü iletmek, mutlaka kopyalama anlamına gelmez, çünkü let
(açık veya zımni) değişmezliği garanti eder, bu nedenle hiçbir şeyi kopyalamaya gerek yoktur. Ve hatta bir içine geçen var
referans şeyler anlamına gelmez olacaktır onlar sadece o, kopyalanabilir olabilir (bir mutasyon var, çünkü) gerekirse olun. Dokümanlar, külotlarınızı bir bükülme haline getirmemenizi özellikle tavsiye ediyor.