Swift 4 String Yapısı #14

Yazıları temsil etmekte kullanılan String yapısı çok kullanıldığı için ayrı bir başlıkta ele alınması uygun görülmüştür. Bir String nesnesi String yapısının başlangıç matotlarıyla yaratılabilir. Örneğin:

var s: String = String() // s boş bir string

Örneğin:

let ch: Character = “a”

var s: String = String(ch)

Burada Character parametreli init metodu kullanılmıştır. Örneğin:

var s: String = String(count: 10, repeatedValue: Character(“a”))

print(s)

Diğer init metotları için Swift dokümanlarını inceleyebilirsiniz.

String yapısının kendisi diğer dillerin aksine bir collection özelliği göstermez. Yapının characters isimli property’si CharacterView isimli bir yapı türündendir. CharacterView yapısı String yapısının içerisinde bildirilmiştir, string’in karakterlerini dışarıya vermek için kullanılır. String.CharacterView yapısı CollectionType, SequenceType ve Indexable protokollerini (arayüzlerini) desteklemektedir. SequenceType yapısını destekleyen sınıf ve yapıların for in deyimiyle kullanılabildiğini anımsayınız. Bu nedenle CharacterView yapısı for in deyimiyle dolaşılabilir. Örneğin:

var s: String = “Test”

for ch in s.characters {

print(ch, terminator: “”)

}

print(“”)

String yapısının String.CharacterView.Index ve Range<String.ChracterView.Index> parametreli iki “subscript” metodu vardır. Bu yüzden String yapısının herhangi bir elemanına köşeli parantez operatörü ile erişilebilir. Ancak köşeli parantezler içerisine Int değerler veremeyiz. Index yapısı CharacterView yapısı içerisinde bildirilmiştir ve elemana erişmekte kullanılan ara bir yapıdır. String yapısının startIndex property’si ilk karakter için Index değerini, endIndex property’si ise son karakterden bir sonrası için Index değerlerini bize verir. Örneğin:

var ch1, ch2: Character
ch1 = s[s.startIndex]
ch2 = s[s.endIndex] // exception oluşur!

Index yapısının advancedBy metodu indeksi ilerletmek için kullanılmaktadır. Örneğin:

for var index = s.startIndex; index != s.endIndex; index = index.advancedBy(1) {
print(s[index], terminator:””)
}
print(“”)

Görüldüğü gibi Index yapısının advancedBy metodu bize artırılmış ya da eksiltilmiş yeni Index nesnesini verir. Yani bizim bu metodun geri dönüş değerini kullanmamız gerekir. Örneğin bir yazının n’inci karakterine şöyle erişebiliriz:

var s = “eskişehir”
print(s[s.startIndex.advancedBy(4)])

Index yapısının ++ operatör metodu da vardır. Aynı işlem şöyle de yapılabilirdi:

for var index = s.startIndex; index != s.endIndex; ++index {
print(s[index], terminator:””)
}
print(“”)

Yazıyı şöyle tersten de yazdırabiliriz:

var s = “eskişehir”
var index = s.endIndex
repeat {
index = index.advancedBy(-1)
print(s[index], terminator: “”)
} while (index != s.startIndex)

Index yapısının predecessor metodu bir önceki indeks değerini elde etmek için successor metodu bir sonraki indeks değerini elde etmek için kullanılabilir. (Tabi aslında bu iki işlemi biz zaten advancedBy metodu ile de yapabiliriz.)

Swift’te tıpkı Objective-C ve C#’ta olduğu gibi extension metotlar vardır. Biz daha rahat çalımak için String sınıfına aşağıdaki gibi subscript metotları ekleyebiliriz:

extension String {
subscript (i: Int) -> Character {
return self[self.startIndex.advancedBy(i)]
}
subscript (r: Range<Int>) -> String {
let start = startIndex.advancedBy(r.startIndex)
let end = start.advancedBy(r.endIndex — r.startIndex)
return self[Range(start: start, end: end)]
}
}

Subscript metotlar ve extension metotlar ileride ele alınacaktır.

String’in karakterlerini bir diziye dönüştürüp erişimi dizi yoluyla da yapabiliriz. Örneğin:

var a:[Character] = [Character](s.characters)
for ch in a {
print(ch, terminator: “”)
}
print(“”)

String yapısında karakterler default olarak UNICODE biçimde tutulmaktadır. Zaten yapının characters property’si de bize yazının karakterlerini Character türü olarak (yani UNICODE karakter olarak verir). Fakat biz String yapısının utf8 ve utf16 property’leri yoluyla yazının karakterlerini UTF8 ve UTF16 biçiminde elde edebiliriz. utf8 prıoperty’si bize yazının karakterlerini UInt8 biçiminde, utf16 ise UInt16 biçiminde verir.

String yapısının append metodu ile yazının sonuna karaktger ekleyebiliriz:

var s: String = “eskişehi”
s.append(Character(“r”))
print(s)

appendContentsOf metodu ile bir yazının sonuna başka bir yuazı eklenebilir:

var s: String = “eski”
s.appendContentsOf(“şehir”)
print(s)

Swift’teki String yapısı C# ve Java’daki String sınıfı gibi “immutable” değildir. Bilindiği gibi o dillerde bir String’in karakterlerini biz değiştiremeyiz. Halbuki Swift’te String nesnesinin karakterleri değiştirilebilmektedir. Swift’in String yapısı, C++’ın string sınıfına oldukça benzemektedir. Swift’teki String yapısını bir çeşit dizi gibi düşünebilirsiniz. Gerçekten de String yapısının içerisinde de bir kapasite tutulmaktadır. String’e eklama yapıldığında bu kapasite duruma göre artırılmaktadır.

Bir String nesnesindeki yazının belli bir karakter öbeğiyle başlayıp başlamadığı, bitip bitmediğini String yapısının hasPrefix ve hasSuffix metotlarıyla belirlenebilir:

func hasPrefix(_ prefix: String) -> Bool
func hasSuffix(_ suffix: String) -> Bool
var s = “eskişehir”
if s.hasPrefix(“eski”) {
print(“evet”)
}
else {
print(“hayır”)
}

String yapısının insert metodu bir karakteri belli indekse eklemek için insertContentsOf metodu bir yazıyı belli bir indekse eklemek için kullanılmaktadır:

mutating func insert(_ newElement: Character, atIndex i: Index)

mutating func insertContentsOf<S : CollectionType where S.Generator.Element == Character>(_ newElements: S, at i: Index)

Örneğin yazının 4'üncü indeksine bir karakter eklemek isteyelim:

var s = “eskişehir”
s.insert(“x”, atIndex: s.startIndex.advancedBy(4))
print(s)
Örneğin:
var s = “esehir”
var k = “kiş”
s.insertContentsOf(k.characters, at: s.startIndex.advancedBy(2))
print(s)

String yapısının removeAll metodu tüm karakterleri silmek için, removeAtIndex metodu belli bir indeksteki karakteri silmek için, RemoveRange ise belli bir aralıktaki karakterleri silmek için kullanılmaktadır.

String yukarıda da vurgulandığı gibi bir yapıdır. Dolayısıyla kategori olarak değer türlerine ilişkindir. Yani bir String türünden nesne karakterlerin kendisini tutmaktadır. Bu durumda biz iki String’i birbirlerine atadığımız zaman birindeki yazı diğerine kopyalanır. Artık birinde yapılan değişiklik diğerini etkilemez. (Halbuki Java ve C#’ta String’ler birer sınıftır. Dolayısıyla String türünden değişkenler nesnenin adresini tutan referanslardır.) Swift’in String yapısının C++’ın string sınıfına bu bakımdan da çok benzediğine dikkat ediniz.

Örneğin:

var s = “ankara”
var k: String
k = s
s.appendContentsOf(“izmir”)
print(s) // ankaraizmir
print(k) // ankara

İki tırnak içerisinde önce bir ters bölü sonra ona yapışık biçimde parantezler içerisinde bir ifade yazılırsa Swift derleyicisi o ifadenin sayısal değerini hesaplayıp onu yazıya dönüştürür ve yazının o kısmına yerleştirir. Buna Swift’te “string interpolation” denilmektedir. Örneğin:

var a = 123
var s = “number:\(a)”
print(s)

Parantezler içerisindeki ifade karmaşık olabilir.

Örneğin:

var a = 123, b = 2
var s = “number:\(a + b * 10)”
print(s)
One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.