2016-12-22 11 views
5

này đang làm việc tốt cho tiếng Anh:chức năng đáng tin cậy để có được vị trí của chuỗi con trong chuỗi trong Swift

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

Nhưng đối với nhân vật nước ngoài giá trị trả về luôn là quá nhỏ. Ví dụ "का" được coi là một đơn vị thay vì 2.

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

Sau này tôi sử dụng 21 trong NSRange(location:length:) nơi nó cần phải được 28 để làm NSRange làm việc đúng cách.

Trả lời

4

A Swift String là bộ sưu tập của Character s và mỗi Character đại diện cho "cụm đồ thị Unicode mở rộng".

NSString là tập hợp các đơn vị mã UTF-16.

Ví dụ:

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

Swift String dãy được biểu diễn dưới dạng Range<String.Index>, và NSString dãy được biểu diễn dưới dạng NSRange.

Chức năng của bạn đếm số Character s từ đầu của haystack để bắt đầu kim, và đó là khác nhau từ số lượng điểm mã UTF-16.

Nếu bạn cần một "NSRange tương thích" nhân vật đếm thì phương pháp đơn giản nhất sẽ được sử dụng range(of:) phương pháp NSString:

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 
} 

Ngoài ra, sử dụng xem utf16 của chuỗi Swift để đếm UTF -16 đơn vị mã:

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 
} 

(Xem ví dụ NSRange to Range<String.Index> fo r các phương thức khác để chuyển đổi giữa Range<String.Index>NSRange).

Các vấn đề liên quan