2016-12-22 46 views
5
Bu İngilizce için iyi çalışıyor

yılında dizede alt dizenin konumunu almak için:Güvenilir işlevi Swift

public static func posOf(needle: String, haystack: String) -> Int { 
    return haystack.distance(from: haystack.startIndex, to: (haystack.range(of: needle)?.lowerBound)!) 
} 

Ama yabancı karakterler için döndürülen değeri her zaman çok küçük. Örneğin "का" Düzgün NSRange çalışması için 28 olması gereken yerde bir birim yerine 2.

posOf(needle: "काम", haystack: "वह बीना की खुली कोयला खदान में काम करता था।") // 21 

sonradan NSRange(location:length:) içinde 21 kullanmak olarak kabul edilir.

cevap

4

bir Swift StringCharacter s topluluğudur, ve her Character "geniş bir Unicode sesletim küme" temsil eder.

NSString, UTF-16 kod birimlerinin bir koleksiyonudur.

Örnek: Range<String.Index>, ve NSString aralıkları NSRange olarak temsil edildiği gibidir String

print("का".characters.count) // 1 
print(("का" as NSString).length) // 2 

Swift aralıkları temsil edilmektedir.

İşleviniz iğnenin başlangıç ​​samanlık başlangıcından itibaren Character s sayar ve UTF-16 kod noktalarının sayısından farklıdır.

bir "NSRange uyumlu" karakter ardından saymak gerekirse kolay yöntem olabilir NSString ait range(of:) yöntemini kullanırsınız: sayım UTF Swift dize utf16 görünüm kullanın Alternatif

let haystack = "वह बीना की खुली कोयला खदान में काम करता था।" 
let needle = "काम" 

if let range = haystack.range(of: needle) { 
    let pos = haystack.distance(from: haystack.startIndex, to: range.lowerBound) 
    print(pos) // 21 
} 

let nsRange = (haystack as NSString).range(of: needle) 
if nsRange.location != NSNotFound { 
    print(nsRange.location) // 31 
} 

-16 kod birimi:

if let range = haystack.range(of: needle) { 
    let lower16 = range.lowerBound.samePosition(in: haystack.utf16) 
    let pos = haystack.utf16.distance(from: haystack.utf16.startIndex, to: lower16) 
    print(pos) // 31 
} 

(örneğin NSRange to Range<String.Index> fo bakınız Daha fazla Range<String.Index> ve NSRange arasında dönüştürme yöntemleri.