
Aşağıdaki örneklerin tümü
var str = "Hello, playground"
startIndex ve endIndex
startIndex ilk karakterin dizini
endIndexendeksidir sonra son karakteri.
Misal
// character
str[str.startIndex] // H
str[str.endIndex] // error: after last character
// range
let range = str.startIndex..<str.endIndex
str[range] // "Hello, playground"
Swift 4'ün tek taraflı menzilleri ile menzil, aşağıdaki formlardan birine basitleştirilebilir.
let range = str.startIndex...
let range = ..<str.endIndex
Açıklık sağlamak için aşağıdaki örneklerde tam formu kullanacağım, ancak okunabilirlik açısından muhtemelen kodunuzda tek taraflı aralıkları kullanmak isteyeceksiniz.
after
De olduğu gibi: index(after: String.Index)
after verilen dizinden hemen sonraki karakterin dizinini ifade eder.
Örnekler
// character
let index = str.index(after: str.startIndex)
str[index] // "e"
// range
let range = str.index(after: str.startIndex)..<str.endIndex
str[range] // "ello, playground"
before
De olduğu gibi: index(before: String.Index)
before verilen dizinden hemen önceki karakterin dizinini ifade eder.
Örnekler
// character
let index = str.index(before: str.endIndex)
str[index] // d
// range
let range = str.startIndex..<str.index(before: str.endIndex)
str[range] // Hello, playgroun
offsetBy
De olduğu gibi: index(String.Index, offsetBy: String.IndexDistance)
offsetByDeğer verilen dizinden pozitif veya negatif ve başlar olabilir. Türünde olmasına rağmen, String.IndexDistancebir Int.
Örnekler
// character
let index = str.index(str.startIndex, offsetBy: 7)
str[index] // p
// range
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -6)
let range = start..<end
str[range] // play
limitedBy
De olduğu gibi: index(String.Index, offsetBy: String.IndexDistance, limitedBy: String.Index)
limitedByEmin ofset endeks sınırların dışında gitmek neden olmaması yapmak için yararlıdır. Sınırlayıcı bir indekstir. Ofsetin sınırı aşması mümkün olduğundan, bu yöntem bir İsteğe Bağlı döndürür. nilEndeks sınırların dışındaysa geri döner .
Misal
// character
if let index = str.index(str.startIndex, offsetBy: 7, limitedBy: str.endIndex) {
str[index] // p
}
Offset 77yerine olsaydı 7, ififade atlanırdı.
String.Index neden gereklidir?
Dizeler için bir dizin kullanmak çok daha kolay olurdu Int. String.IndexHer String için yeni bir tane oluşturmanız gerekmesinin nedeni, Swift'deki Karakterlerin başlık altında aynı uzunlukta olmamasıdır. Tek bir Swift Karakteri, bir, iki veya daha fazla Unicode kod noktasından oluşabilir. Bu nedenle, her benzersiz String, Karakterlerinin dizinlerini hesaplamalıdır.
Bu karmaşıklığı bir Int dizin uzantısının arkasına gizlemek olasıdır, ancak bunu yapmakta isteksizim. Gerçekte ne olduğunun hatırlatılması güzel.
startIndex0'dan başka bir şey olsun ki?