Swift Programlama – Structures (Yapılar)

Structures (Yapılar)

Swift, sayılar, metinler, koleksiyonlar ve doğru veya yanlış değerler gibi verileri temsil etmek için birçok yararlı türle birlikte gelir. Ancak, uygulamaları geliştirirken kendi tasarımınızın özelliklerini ve işlevlerini içeren kendi veri türlerini oluşturmak isteyeceksiniz.

Bir yapı bildirerek özel bir veri türü oluşturursunuz. Structure (Yapı), bir veya daha fazla değişkeni tek bir türe birleştirir. Yapıya tür ve örnek yöntemleri ekleyerek işlevsellik tanımlayabilirsiniz.

Bu derste yapıları nasıl oluşturacağınızı öğreneceksiniz ve yapıların kodunuzun yapı taşlarını nasıl şekillendirdiğini keşfedeceksiniz.

Ne Öğreneceksin

  • Özel bir yapı nasıl oluşturulur
  • Yapı üzerinde nasıl tanımlanır
  • Bir yapıya yöntemler veya işlevler ekleme

 

Bunu fark etmemiş olabilirsiniz, ancak bu dersin başlangıcından beri yapılarla çalışıyorsunuz. Swift, yaygın veri türlerini temsil etmek için önceden tanımlanmış yapılarla birlikte gelir. Kendi yapılarınızı, programınızın veya uygulamanızın özel ihtiyaçlarına uyan bir tür istekte tanımlayabilirsiniz.

En basit biçiminde bir yapı, bir türden oluşan bir veya daha fazla özelliğin adlandırılmış bir grubudur. Özellikler, yapının bir örneği hakkındaki bilgileri temsil eder.

Yapıyı, benzersiz ad olan struct anahtar kelimesini kullanarak tanımlarsınız. Daha sonra, özelliklerini, sabit veya değişken bildirimleri uygun tür notlarıyla listeleyerek yapının bir parçası olarak tanımlayabilirsiniz. Tür adlarını büyük harfle kullanmak ve özellik adları için küçük harf kullanmak gelenek olmuştur.

Bir “isim” özelliği olan  “Personel” yapısının basit bir görünümünü düşünün:

 

 

Nokta sözdizimini kullanarak kişilerin “isim” gibi özelliklerde depolanan verilere erişebilirsiniz:

 

 

 

Örnekteki isim ‘in  ima ettiği gibi, programınızın ömrü boyunca yaratılan birden fazla kişi olabilir. Oluşturduğunuz bir sonraki örneğe ikinciPersonel adı verilebilir veya birden çok Personel nesnesi barındıran “insanlar” adlı bir koleksiyon oluşturabilirsiniz. Yalnızca tek bir Personel oluşturmayı düşünüyorsanız, Swift, kişi adlı bir Personel’ in bir örneğini oluşturmanıza izin verir.

Bir function ekleyerek yapıya işlevsellik katabilirsiniz. function, belirli bir türe atanan bir işlevdir. Bu örnekte, “Personel” yapısında  “merhaba” fonksiyonu kullanılmıştır.

 

Artık örnek yöntemini doğrudan nokta sözdizimi kullanarak çağırabilirsiniz.

Sonraki bölümlerde, örnekler ve metotları hakkında daha fazla bilgi edineceksiniz.

 

Instances (Örnekleri)

Bir yapı yeni bir türe tanımladığını öğrendiniz. Bu türünü kullanmak için, başlatma adı verilen bir işlem örneği oluşturmalısınız. Başlatma işleminden sonra her örnek, yapının tüm özelliklerini devralır.

Aşağıdaki örnekte hem myShirt hem de yourShirt, size ve color özellikleri gömlek nesnesinin özelliklerini alır. Ancak her biri, bireysel olarak farklı değerlere sahip ayrı bir gömlektir ve dolayısıyla Shirt türünün ayrı bir örneğidir. Size ve color türleri, ileriki derste öğreneceğiniz numaralandırma adı verilen mevcut seçeneklerin bir grubunu tanımlar.

 

Bir yapı tanımı için başka bir örnekte, bu sefer fonksiyon eklendi. Yapı, bir Car nesnesinin niteliklerini ve fonksiyonunu tanımlar ve firstCar ve secondCar öğelerini iki örnekte tanımlar.

Bu koddaki arabalar ne yaptı? firstCar ve secondCar’ı iki özel araç olarak hayal edin, bu kod çalıştırıldığında sadece firstCar olan birinci araç çalışacak secondCar olan ikinci araç çalıştırılmayacaktır.

 

Initializers (Başlatıcılar)

Bütün Swift türlerinde, türe yeni bir örnek döndürüleceği zaman fonksiyona benzer bir başlatıcı ile birlikte gelir. Varsayılan başlatıcı init()‘ dir.

Varsayılan başlatıcıdan oluşturulan örneklerin varsayılan değerleri vardır. String varsayılanı boşluk (“”), Int varsayılanı sıfır( 0) ve  Bool varsayılanı false‘dur: Kullanımları ise

Ancak varsayılan başlatıcının kısa versiyonu daha yaygın. Aşağıdaki snippet daha kısadır, yukarıdaki örnekle aynı şekilde çalışmaktadır:

Ne zaman yeni bir tür tanımlarsanız, yeni örnekler nasıl oluşturacağınızı düşünmelisiniz. Bu ders, özellik değerlerini başlatmaya yönelik farklı yöntemleri kapsar.

Default Values (Varsayılan Değerler)

Yeni örneklerin başlatılması sırasında, Swift tüm örnek nitelikleri için değerler ayarlamanızı gerektirir.

Tür tanımında varsayılan özellik değerlerini sağlamaktır. Her örnek, o değerle başlatılacaktır. Bu, bir kilometre sayacında 0 okuma gibi tutarlı bir varsayılan duruma sahip nesneleri tanımlarken yararlanılır.

Önceki bölümde, String, Int ve Bool için varsayılan değerleri gördünüz. Varsayılan özellik değerlerini kullanarak, özel türlerinizin her yeni örneği için varsayılan bir durum oluşturabilirsiniz.

Özellik bildirilirken sayının varsayılan bir değeri 0 olarak ayarlandığını unutmayın. Odometre‘nin tüm yeni örnekleri bu varsayılan değerle oluşturulur.

Memberwise Initializers (Üye Bilginin Başlangıç Değerleri)

Bazen, varsayılan olmayan bir değere sahip yeni bir örneğini oluşturmak isteyeceksinizdir. Örneğin, Odometre ile önceki bir yolculuktan önceki bir yolcuyu başlatmanız gerekebilir. Yeni bir yapı tanımladığınızda, Swift, bir yapının tüm özelliklerini içeren bir üye başlatıcı olarak adlandırılan özel başlatıcı oluşturur. Üye açılı başlatıcı, yeni örneğe ait her özellik için başlangıç değerlerini ayarlamanızı sağlar.

Türünün yeni örnekleri için varsayılan bir durum olmadığında, Memberwise başlatıcılar doğru yöntemdir.

Bir name özelliği olan bir Person yapısını düşünün. name için varsayılan değeri ne olarak atarsınız?

İlk bakışta, name için varsayılan değerin “” olabileceğini söyleyebilirsiniz. Ancak boş bir String bir name değildir ve yanlışlıkla String i boş name ile başlatmak istemiyorsunuz.

Bir üye başlatıcıyı (memberwise) çağırmak için, her bir özelliğe eşleşen parametreleri içeren parantezlerin ardından tür adını kullanın. Aslında, bu ders boyunca çeşitli kod snippet’lerinde üye başlatıcıları (memberwise) gördünüz:

Üye başlatıcıları (memberwise), özel yapılarınızın yeni örneklerini oluşturmanın en yaygın yoludur. Fakat tüm özellikleri atamadan önce bazı özel mantığı tamamlayan bir başlatıcı tanımlamak istediğiniz zamanlar olabilir. Bu gibi durumlarda, özel başlatıcı tanımlayabilirsiniz.

Custom Initializers (Özel Başlatıcılar)

 

Kendiniz başlatıcıyı tanımlayarak başlatma işlemini özelleştirebilirsiniz. Özel başlatıcıların varsayılan ve üye olmayan başlatıcılarla aynı gereksinimi vardır: Başlatma işlemini tamamlamadan önce tüm özellikler başlangıç değerlerine ayarlanmalıdır.

Celsius özelliğine sahip bir Temperature yapısını düşünün. Celsius‘da bir sıcaklığa erişirseniz, bir memberwise kullanarak başlatabilirsiniz.

Ancak, Fahrenheit cinsinden bir sıcaklığa erişebiliyorsanız, üye açma başlatıcıyı (memberwise ) kullanmadan önce bu değeri Celsius’a çevirmeniz gerekir.

Memberwise başlatıcı yeni Sıcaklık nesnesini başlatmadan önce okunanDerece değerini hesaplamanız gerekti. Bunun yerine, bir parametre olarak bir “fahrenytOkunan” değerini alır, hesaplamayı gerçekleştirir ve değeri derece özelliğine atayan özel başlatıcı oluşturabilirsiniz.

Önceki örnekte bir üye yönergenin (memberwise) başlatıldığını fark edebilirsiniz. Bir tür tanımına bir özel başlatıcı (custom initializer ) eklediğinizde, kendi üye açma başlatıcısını (memberwise initializer) tanımlamanız gerekir; çünkü Swift artık sizin için önermiyor.

Birden fazla özel başlatıcı (multiple custom initializers) ekleyebilirsiniz. Aşağıdaki kod, bir Kelvin başlatıcı eklemek için Sıcaklık yapısı yeniden tanımlar.

Sıcaklık‘ın her örneği farklı bir başlatıcı ve farklı bir değer kullanarak oluşturuldu, ancak her biri için gerekli Sıcaklık nesnesi olan derece özelliği ile bitiyor.

Instance Methods (Metot Örnekleri)

Örnek yöntemleri, belirli bir örnek türünün çağrı yapılabilen fonksiyonlardır. Yapının özelliklerine erişme ve bunları değiştirme yolları sağlarlar ve örnek amacıyla ilişkili işlevsellikler eklerler.

Daha önce öğrendiğiniz gibi, bir tür tanımı içinde bir fonksiyon ekleyerek bir örnek yöntemi ekleyin. Ardından, bu fonksiyon türünü örnekleri üzerinde çağırın. Bu sözdizimini daha önce Personel veya Car yapılarında fark etmişsinizdir.

Belirli bir örneğin alanını genişlik ve yüksekliği çarparak alanını hesaplayan alan() örnek metodun  içeren bir “Size” yapısını düşünün:

 

boyutlar örneği Boyut türündendir, genişlik ve yükseklik özellikler vardır. alan(), Boyut türünün tüm örneklerinde çağrılabilen bir örnek yöntemidir.

 

Mutating Methods (Değişen Metotlar)

Bazen, bir örnek yönteminde bir yapının özellik değerlerini güncellemek isteyeceksiniz. Bunu yapmak için mutating anahtar sözcüğü işlevin önüne eklemeniz gerekir.

Aşağıdaki örnekte, basit bir structure (yapı)’nın belirli bir Araba nesnesi ile ilgili kilometre verileri depolar. Koda bakmadan önce kilometre sayacının hangi verileri saklayacağını ve gerçekleştirmesi gereken işlemleri düşünün.

 

  • Bir kilometre sayacında gösterilecek kilometre sayısını saklama
  • Araba sürerken kilometre sayısını artırmak için kilometre sayısını artırılacak
  • Araç, kilometre sayacında gösterilebilecek km sayısını aşıyorsa potansiyel olarak kilometre sayısını sıfırlayın.

kilometre örneği Kilometre tipindedir ve artis() ve artis(by :), örneğe km ekleyen örnek metorlardır. Reset () örneği metodu, kilometre sayısını sıfıra ayarlar.

 

Computed Properties (Hesaplanan Özellikler)

 

Swift’te, özelliği hesaplanmış bir değeri döndüren mantığı kullanmasına izin veren bir özellik vardır.

Sıcaklık örneğini düşünün. Dünyanın çoğu yerinde sıcaklığı için derece (Celsius) ölçüm kullanırken, bazı yerler (ABD gibi) Fahrenheit kullanıyor ve bazı meslekler Kelvin’i kullanıyor. Bu nedenle, Sıcaklık yapısının tüm üç ölçüm sistemini desteklemesi yararlı olabilir.

Bu yapı için memberwise başlatıcıyı kullandığınızı düşünün:

Bir Sıcaklık nesnesini başlatmak için kod yazarsanız, her bir sıcaklığı hesaplamanız ve tüm bu değerleri parametreler olarak iletmeniz gerekir.

Alternatif hesaplamaları işleyen birden çok başlatıcı eklemek gerekecektir.

Çıktısı:

Yukarıdaki yol, birden fazla başlatıcı kullanarak, bir çok durum veya bilgiyi yönetmeyi içerir. Sıcaklık her değiştirildiğinde, üç özelliğin de güncellenmesi gerekecektir. Bu yol yanlıştır ve herhangi bir programcı için sinir bozucu olur.

Swift daha güvenli bir yol sağlar. Hesaplanan özellikler ile diğer örnek özelliklerine veya mantığa dayalı olarak değerlerini hesaplayabilen özellikler oluşturabilirsiniz.

Hesaplanmış bir özellik eklemek için değişken özellik olarak bildirirsiniz (değeri değişebilir). Ayrıca türünü açıkça bildirmeniz gerekir. Ardından, döndürülecek değeri hesaplayan mantığı tanımlamak için süslü parantezler ( { } ) kullanırsınız.

Hesaplanan özelliklere başka özelliklerde olduğu gibi nokta sözdizimi kullanarak erişebilirsiniz.

Hesaplanmış özellikte bulunan mantık, özelliğe her erişildiğinde yürütülecektir, bu nedenle döndürülen değer her zaman güncel olacaktır.

Property  Observers ( Özellik İzleyici)

Swift herhangi bir özelliği izlemenize ve özelliğin değerindeki değişikliklere cevap vermenize izin verir. Bu özellik izleyicileri, yeni değerin özelliğinin geçerli değeri ile aynı olmasına rağmen bir özelliğin değeri her ayarlandığında çağrılır. Belirli bir özelliğe tanımlayabileceğiniz iki izleyici kapanışı veya kod bloğu vardır: willSet ve didSet.

Aşağıdaki örnekte, bir StepCounter, bir toplamAdim özelliği  tanımlanmıştır. Hem willSet hem de DidSet gözlemcileri tanımlandı. Başlangıçta toplamAdim değeri 0 dır. toplamAdim değiştirildiğinde, önce willSet çağrılır ve newValue adlı sabitteki özellik değerine ayarlanacak yeni değere erişirsiniz. Mülkün değeri güncellendikten sonra, DidSet çağrılır ve eski mülk değerine oldValue‘yu kullanarak erişebilirsiniz.

Type Properties and Methods ( Tür Özellikleri ve Metotları)

 

Örnek metotlar, bir türün bireysel örnekleri üzerinde çağrılabilen fonksiyonlardır. Swift, türün kendisine erişilebilen veya çağrılabilen tür özelliklerini ve metotları eklemeyi de desteklemektedir. Bir türe bir özellik veya metot eklemek için static anahtar sözcüğünü kullanılır.

Tür özellikleri, bir özellik, türüne bağlıysa, ancak örneğin kendisinin bir özelliği değilse yararlıdır.

Aşağıdaki örnek, tüm sıcaklık örnekleri için sabit bir değer olan “kaynamaNoktasi” adlı bir statik özelliği  Sıcaklık yapısında (struct)  tanımlar.

Tür adına nokta sözdizimini kullanarak özelliklerine erişirsiniz.

Metot tipleri, tür özelliklerine benzer. İşlem türü ile alakalıysa veya türün belirli bir örneğini gerçekleştirmesi gereken bir şey değilse, metot tiplerini kullanın.

Swift Standart Kitaplığı’nda tanımlanan Double structure (yapı), bir sayının mutlak değerini hesaplayan statik bir yöntem olan abs‘yi içerir. Çağırmak için bir Double örneğini bulundurmanız gerekmediğine dikkat edin.

Copying (Kopyalama)

Bir değişkene bir yapı atarsanız veya bir örneği parametre olarak bir işleve aktarırsanız, değerler kopyalanır. Ayrı değişkenler bu nedenle değerin ayrı örnekleridir, bu da bir değerin değiştirilmesinin diğerini değiştirmediği anlamına gelir.

asilBoyut ‘in width özelliğinin değeri 500 olarak değişti ancak kopyaBoyut öğesini asilBoyut öğesine eşit olarak ayarlamış, asilBoyut öğesinin bir kopyasını width özelliği orijinalinde değiştirildi.

Çıktı:

Self (Kendine)

Swift’ de self, nesnenin geçerli örneğini belirtir. Nesnenin geçerli örneğini işaret etmek için bir örnek metot içinde kullanılabilir.

Çoğu dil, örnek niteliği veya tür tanımındaki metotları belirtmek için “self” in kullanılmasını gerektirir. Swift derleyici, geçerli nesne üzerinde özellik veya metot adlarının ne zaman var olduğunu tanır ve “self” i isteğe bağlı olarak kullanmayı sağlar.

Bu fonksiyon örneği önceki örnekle aynıdır.

Özellik adlarıyla eşleşen parametre adlarına sahip başlatıcılar içinde” self “kullanımı gereklidir.

Buna gölgelendirme (shadowing) denir ve sonraki derste daha fazla bilgi edineceksiniz.

Variable Properties (Değişken Özellikleri)

Bu dersin tüm yapı örneklerinin sabitler yerine değişken nitelikteki özellikleri kullandığını fark ettiniz mi? Ders başında kullanılan Araba tanımını düşünün.

Bir otomobilin rengi bir boya işiyle kolayca değiştirilebilir ve motorun sahibi motoru yükseltirse üst hız güncellenebilir. Fakat bir otomobilin markası ve yılı asla değişmeyecek, peki neden özelliklerini let‘i kullanarak tanımlayalım değil mi ?

Değişken özellikler, eski verilerden yeni veri oluşturmak için uygun bir yol sağlar. Aşağıdaki kodda, mavi bir 2010 Ford yapmak, 2010 Honda’nın bir kopyasını yapmak “marka” özelliğini değiştirmek kadar basittir. “marka” özelliği sabitse, ikinci araba, memberwise başlatıcıyı kullanarak oluşturulmalıdır.

Bu dersin başında, bir yapının bir örneği yeni bir değişkene atandığında değerlerin kopyalanacağını öğrendiniz. Önceki örnekte, birinciAraba hala bir Honda. ikinciAraba’ nın özelliklerinin sürekli değişmesini önlemek istiyorsanız, örneği bir let kullanmanız gerekmektedir.

Özellikler, “var” kullanılarak bildirilmiş olsa bile, bir sabitin değerleri değiştirilemez. Genel bir kural olarak, bir yapının bir örneğini tanımlamak mümkün olduğunda “let” i kullanmalı, örnek değişikliğe uğratılması ve bir yapının özelliklerini tanımlama gerekiyorsa  “var” kullanmalısınız.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.