Aşağıdaki örneklerin tümü
var str = "Hello, playground"
Hızlı 4
Swift 4'te dizeler oldukça büyük bir revizyon aldı. Şimdi bir String'den bir alt dize aldığınızda, a Substring
yerine bir tür alırsınız String
. Bu neden? Dizeler Swift'teki değer türleridir. Bu, yeni bir tane yapmak için bir Dize kullanırsanız, o zaman kopyalanması gerekir. Bu istikrar için iyidir (başka kimse sizin bilginiz olmadan değiştirmeyecektir) ama verimlilik için kötüdür.
Diğer yandan, bir Alt dize, geldiği orijinal Dize'ye bir referanstır. İşte bunu gösteren belgelerden bir resim .
Kopyalamaya gerek yoktur, bu nedenle kullanımı çok daha verimlidir. Bununla birlikte, bir milyon karakterlik String'den on karakterlik bir Substring aldığınızı düşünün. Alt Dize Dizeye başvuruda bulunduğundan, alt Dizenin etrafında olduğu sürece sistemin tüm Dize'ye bağlı kalması gerekir. Böylece, Substring'inizi manipüle etmeyi bitirdiğinizde onu bir String'e dönüştürün.
let myString = String(mySubstring)
Bu sadece alt dizgiyi kopyalar ve eski String'i tutan bellek geri alınabilir . Alt dizeler (tip olarak) kısa ömürlüdür.
Swift 4'teki bir başka büyük gelişme, Dizelerin Koleksiyonlar (yine) olmasıdır. Bu, bir Koleksiyonda her ne yapabilirseniz yapın, bir String'e yapabilirsiniz (abonelik kullanın, karakterler üzerinde yineleme, filtre vb.).
Aşağıdaki örnekler Swift'te nasıl alt dize alacağınızı gösterir.
Alt dizeleri alma
Sen (örneğin, alt simgeler veya diğer yöntemlerle bir dizi kullanarak bir dize bir alt dizeyi alabilirsiniz prefix
, suffix
, split
). Yine de , aralık için String.Index
bir Int
dizin değil , kullanmanız gerekir . ( Bununla ilgili yardıma ihtiyacınız olursa diğer cevabımı görün .)
Bir dizenin başlangıcı
Bir alt simge kullanabilirsiniz (Swift 4 tek taraflı aralığa dikkat edin):
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str[..<index] // Hello
veya prefix
:
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str.prefix(upTo: index) // Hello
veya daha da kolay:
let mySubstring = str.prefix(5) // Hello
Dizenin sonu
Abonelikleri kullanma:
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str[index...] // playground
veya suffix
:
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str.suffix(from: index) // playground
veya daha da kolay:
let mySubstring = str.suffix(10) // playground
suffix(from: index)
Ben kullanırken son kullanarak geri saymak zorunda olduğunu unutmayın -10
. Sadece bir Dize'nin suffix(x)
son x
karakterlerini alan sadece kullanırken bu gerekli değildir .
Bir dizedeki aralık
Yine burada sadece abonelikler kullanıyoruz.
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -6)
let range = start..<end
let mySubstring = str[range] // play
Şuraya dönüştürülüyor Substring
:String
Unutmayın, alt String
dizenizi kaydetmeye hazır olduğunuzda, eski dizenin belleğinin temizlenebilmesi için bunu dizeye dönüştürmelisiniz .
let myString = String(mySubstring)
Bir Int
dizin uzantısı mı kullanıyorsunuz?
Airspeed Velocity ve Ole Begemann tarafından Swift 3'te DizelerInt
makalesini okuduktan sonra temel bir dizin uzantısı kullanmaktan çekinmeyin. Swift 4'te, Dizeler koleksiyon olsa da, Swift ekibi özellikle endeks kullanmamıştır. Hala öyle . Bu, Swift Karakterlerin değişen sayıda Unicode kod noktasından oluşmasıyla ilgilidir. Gerçek indeks, her dize için benzersiz bir şekilde hesaplanmalıdır.Int
String.Index
Söylemeliyim ki, umarım Swift ekibi String.Index
gelecekte soyutlamak için bir yol bulur . Ancak onlara kadar API'larını kullanmayı tercih ediyorum. Dize manipülasyonlarının sadece basit Int
dizin aramaları olmadığını hatırlamama yardımcı olur .