Swift'de bir Dizenin (önek) ile başladığını veya (sonek) ile bittiğini kontrol etme


102

Bir Swift dizesinin belirli bir değerle başlayıp bitmediğini test etmeye çalışıyorum. Bu yöntemler mevcut değil:

var str = "Hello, playground"
str.startsWith("Hello") // error
str.endsWith("ground") // error

Ayrıca önek ve sonek dizelerini de almak istiyorum. Burada ve burada yanıtlandığı gibi bir alt dize bulabilirim , ancak aralıklar Swift'de çok zor .

Bunu yapmanın daha kolay bir yolu var mı?

( Belgeleri okurken yanıta rastladım ve arama terimlerim için bir SO yanıtı gelmediğinden, Soru-Cevap'ımı buraya ekliyorum.)

Yanıtlar:


206

Swift 4 için güncellendi

Bir dizenin neyle başladığını ve neyle bittiğini kontrol etme

Başka bir String ile eşitliği test etmek için hasPrefix(_:)ve hasSuffix(_:)yöntemlerini kullanabilirsiniz .

let str = "Hello, playground"

if str.hasPrefix("Hello") { // true
    print("Prefix exists")
}

if str.hasSuffix("ground") { // true
    print("Suffix exists")
}

Gerçek Önek ve Sonek Alt Dizelerini Alma

Gerçek öneki veya sonek alt dizesini elde etmek için aşağıdaki yöntemlerden birini kullanabilirsiniz. Basit olması için ilk yöntemi öneriyorum. Tüm yöntemler şu şekilde kullanılır str:

let str = "Hello, playground"

Yöntem 1: (Önerilen) prefix(Int)vesuffix(Int)

let prefix = String(str.prefix(5)) // Hello
let suffix = String(str.suffix(6)) // ground

Bence bu daha iyi bir yöntem. Aşağıdaki 2. ve 3. yöntemlerin aksine, dizinler sınırların dışına çıkarsa bu yöntem çökmeyecektir. Yalnızca dizedeki tüm karakterleri döndürür.

let prefix = String(str.prefix(225)) // Hello, playground
let suffix = String(str.suffix(623)) // Hello, playground

Elbette bazen kilitlenmeler iyidir çünkü kodunuzla ilgili bir sorun olduğunu size bildirirler. Bu yüzden aşağıdaki ikinci yöntemi de düşünün. Endeks sınırların dışına çıkarsa hata verir.

Yöntem 2: prefix(upto:)vesuffix(from:)

Swift String dizinleri aldatıcıdır çünkü özel karakterleri (emoji gibi) hesaba katmaları gerekir. Ancak dizini aldıktan sonra ön ek veya son eki almak kolaydır. (Bkz benim diğer cevabı üzerine String.Index.)

let prefixIndex = str.index(str.startIndex, offsetBy: 5)
let prefix = String(str.prefix(upTo: prefixIndex)) // Hello

let suffixIndex = str.index(str.endIndex, offsetBy: -6)
let suffix = String(str.suffix(from: suffixIndex)) // ground

Sınırların dışına çıkmaya karşı korunmak istiyorsanız, kullanarak bir dizin oluşturabilirsiniz limitedBy(yine, bu yanıta bakın ).

Yöntem 3: abonelikler

String bir koleksiyon olduğundan, öneki ve soneki almak için abonelikleri kullanabilirsiniz.

let prefixIndex = str.index(str.startIndex, offsetBy: 5)
let prefix = String(str[..<prefixIndex]) // Hello

let suffixIndex = str.index(str.endIndex, offsetBy: -6)
let suffix = String(str[suffixIndex...]) // ground

Daha fazla okuma


5

Önek ve Sonek Eşitliği

Bir dizenin belirli bir dize öneki veya son eki olup olmadığını kontrol etmek için, dizenin hasPrefix ( :) ve hasSuffix ( :) yöntemlerini çağırın , her ikisi de String türünde tek bir bağımsız değişken alır ve bir Boolean değeri döndürür.

Apple Dokümanı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.