Swift: Yapılar ve sınıflar arasındaki farklar

Diğer birçok programlama dili ile karşılaştırıldığında, Swift’de yapılar çok güçlüdür. Bu nedenle, daha sık kullanılmaları gerekir.

Diğer birçok programlama dili ile karşılaştırıldığında, Swift’de yapılar çok güçlüdür. Bu nedenle, daha sık kullanılmaları gerekir.

Benzerlikler

İlk önce, yapılar ve sınıflar arasındaki benzerlikler hakkında konuşarak başlayalım. Aslında çok fazla ortak noktaları var:

  • yöntemleri ve başlatıcıları var
  • saklanmış ve hesaplanmış özellikleri var
  • uzatılabilirler 
  • protokolleri uygulayabilirler 

Bu özellikleri nasıl kullandığınızla ilgili bazı farklılıklar var, ancak bunlar küçük ve bu yazının ana parçası değiller. Örneğin, yapılar için başlatıcılar otomatik olarak oluşturulur, oysa sınıflar için bunu elle yapmanız gerekir.

Farklılıklar

Yapılar ve sınıflar arasında üç ana fark vardır:

  • Yapılar değer türleridir, sınıflar referans türleridir. 
  • Sınıflar miras edilebilir. Yapılar için bu mümkün değildir. 
  • Yapılar için objektif-C birlikte çalışabilirliği çok kötü, oysa sınıflar için çok iyidir.

Bu farklılıklara ayrıntılı olarak bakalım.

Değer türleri ve referans türleri

Öyleyse, bir değer tipi ile referans tipi arasındaki fark nedir? Referans türünün bir örneğine doğrudan erişilemez, ancak yalnızca sözde başvuru kullanılarak erişilebilir. Bu nedenle, çarpım referansları aynı örneği gösterebilir. Aşağıdaki örneğe bir göz atın:

class TestClassA {
    
    var a: Int
    
    init(a: Int) {
        self.a = a
    }
    
}
 
let testA = TestClassA(a: 5)
let testB = testA
 
print(testA.a) //5
print(testB.a) //5
 
testA.a = 10
 
print(testA.a) //10
print(testB.a) //10

Görebildiğiniz gibi, TestClassA’nın sadece bir örneği yaratılmış, ancak iki referans buna işaret ediyor. Eğer mülk değiştirirseniz a ait Testa , aynı yönelik olur TestB aynı örneği olduğu için.

Şimdi bir yapıya bakalım:

struct TestStruct {
    var a: Int
}
 
var testC = TestStruct(a: 5)
var testD = testC
 
print(testC.a) //5
print(testD.a) //5
 
testC.a = 10
 
print(testC.a) //10
print(testD.a) //5

Yine iki değerimiz var ( testC ve testD ). Eğer bir değerin bir özelliği değişirse, bu aynı değildir çünkü diğeri için olmaz.

Ayrıca testC ve testD’nin var anahtar sözcüğünü kullanarak değişken olarak bildirilmesi gerektiğini de unutmayın . Bir yapının özelliğini sabit tutmak mümkün değilse, bir yapının özelliğini değiştirmek mümkün değildir.

Int , String ve Array gibi bazı Swift tipleriyle aynıdır – bunlar aynı zamanda değer tipleridir. Ama sadece bu değil, aynı zamanda yapılar!

Int değerlerine sahip yukarıdaki örneğe karşılık gelen örnek :

var testE = 5
var testF = testE
 
print(testE) //5
print(testF) //5
 
testE = 10
 
print(testE) //10
print(testF) //5

Henüz yapılarla çalışmadıysanız, son örnek muhtemelen sizin için çok daha doğal. Sadece bir yapı sadece olarak çalıştığını kendinize hatırlatmak Int bir değeri nedeniyle Int olan bir yapı.

Referans tipleri ve değer tipleri oldukça farklı davranır. Bir referans türünün bir örneğinin ve uygulamanız içinde kendisine işaret eden birden fazla referansınızın olduğunu hayal edin. Bu referanslardan birini kullanarak değeri değiştirirseniz, bu referansların tümü aynı yeni değere işaret eder. Bu aranan bir davranış olabilir. Ancak durum böyle değilse, bu büyük hataların kaynağı olabilir. 

Değer ve referans türleri arasındaki farklar nedeniyle, bellek yönetimi de oldukça farklıdır. En önemli nokta, referans türleri için sözde tutma çevrimlerinin meydana gelmesidir. Değer türleri için bu mümkün değildir. 

Objective-C birlikte çalışabilirlik 

Swift’deki yapılar iyi bir Amaç-C birlikte çalışabilirliğine sahip değildir. Swift’de bir yapı tanımlarsanız, onu Objective-C kaynak koduna maruz bırakamazsınız. Bu, örneğin, UITableView’ın bir temsilcisinin veya veri kaynağının bir yapı değil, bir sınıf olması gerektiği anlamına gelir çünkü UIKit hala Objective-C dilinde yazılmıştır. Kulağa büyük bir engel gibi geliyor, ancak gerçekte bu durumlar sizin düşündüğünüzden daha nadir görülür. 

Inheritance 

Kısacası: Yapılar için kalıtım yoktur. Ancak, yapılar için benzer davranışları uygulamanın başka yolları da vardır. En yaygın yol protokolleri kullanmaktır. 

Yapıları varsayılan olarak kullan 

Bu yüzden genel kural, varsayılan olarak yapılandırmanız gerektiğidir. Bunun nedeni, kullanımlarının daha kolay ve daha güvenli olmasıdır: Tutma döngüleri gerçekleşemez ve uygulamanın başka bir kısmının değerini kazayla değiştiremezsiniz. 

Yalnızca kalıtım, Objective-C ile birlikte çalışabilirlik gibi sınıfa özgü özelliklere ihtiyacınız varsa veya bir referans türünün belirli davranışını istiyorsanız, sınıfları kullanmalısınız. 

Comments

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

GIPHY App Key not set. Please check settings

Yükleniyor…

0

Ne düşünüyorsun?

Amazon Mağaza Açma Rehberi / 2020

Swift: Referans Eşitliği