Aşağıdaki örneklerin tümü
var str = "Hello, playground"
startIndex
ve endIndex
startIndex
ilk karakterin dizini
endIndex
endeksidir 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)
offsetBy
Değer verilen dizinden pozitif veya negatif ve başlar olabilir. Türünde olmasına rağmen, String.IndexDistance
bir 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)
limitedBy
Emin 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. nil
Endeks 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 77
yerine olsaydı 7
, if
ifade atlanırdı.
String.Index neden gereklidir?
Dizeler için bir dizin kullanmak çok daha kolay olurdu Int
. String.Index
Her 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.
startIndex
0'dan başka bir şey olsun ki?