यहाँ एक स्विफ्ट 3 काम कर संस्करण, NSRange, रेंज, स्ट्रिंग के लिए है और एनएसएसटींग! आनंद लें :)
/// All ranges using NSString and NSRange
/// Is usually used together with NSAttributedString
extension NSString {
public func ranges(of searchString: String, options: CompareOptions = .literal, searchRange: NSRange? = nil) -> [NSRange] {
let searchRange = searchRange ?? NSRange(location: 0, length: self.length)
let subRange = range(of: searchString, options: options, range: searchRange)
if subRange.location != NSNotFound {
let nextRangeStart = subRange.location + subRange.length
let nextRange = NSRange(location: nextRangeStart, length: searchRange.location + searchRange.length - nextRangeStart)
return [subRange] + ranges(of: searchString, options: options, searchRange: nextRange)
} else {
return []
}
}
}
/// All ranges using String and Range<Index>
/// Is usually used together with NSAttributedString
extension String {
public func ranges(of searchString: String, options: CompareOptions = [], searchRange: Range<Index>? = nil) -> [Range<Index>] {
if let range = range(of: searchString, options: options, range: searchRange, locale: nil) {
let nextRange = range.upperBound..<(searchRange?.upperBound ?? endIndex)
return [range] + ranges(of: searchString, searchRange: nextRange)
} else {
return []
}
}
}
यदि मैं दस्तावेज़ीकरण को सही ढंग से समझ रहा हूं, तो यह सेट में किसी भी वर्ण की सीमा प्रदान करेगा। लेकिन मुझे * प्रत्येक * चरित्र की गिनती की आवश्यकता है। – Elliot
मेरा विचार char -> गिनती जोड़े का शब्दकोश रखना है और उसके बाद दिए गए इंडेक्स पर चार प्राप्त करें और शब्दकोश में इसकी गिनती बढ़ाएं ... या आप स्ट्रिंग पर फिर से सक्रिय हो सकते हैं और जांच सकते हैं कि प्रत्येक अक्षर आपके सेट में है या नहीं, अगर यह इसके बाद यह बढ़ता है – stefanB