সুইফ্ট স্ট্রিংয়ে অক্ষরের সূচক সন্ধান করা


203

পরাজয় স্বীকার করার সময় এসেছে ...

অবজেক্টিভ-সি তে, আমি এরকম কিছু ব্যবহার করতে পারি:

NSString* str = @"abcdefghi";
[str rangeOfString:@"c"].location; // 2

সুইফটে, আমি দেখতে কিছু অনুরূপ:

var str = "abcdefghi"
str.rangeOfString("c").startIndex

... তবে এটি আমাকে একটি দেয় String.Index, যা আমি আবার মূল স্ট্রিংয়ের সাবস্ক্রিপ্ট হিসাবে ব্যবহার করতে পারি, তবে এর থেকে কোনও অবস্থান বের করতে পারি না।

এফডব্লিউআইডাব্লু, String.Indexএর একটি ব্যক্তিগত আইভার রয়েছে যার _positionমধ্যে এটির সঠিক মান রয়েছে। আমি এটি দেখতে পাচ্ছি না যে এটি কীভাবে প্রকাশিত হয়েছে।

আমি জানি আমি স্ট্রিংয়ের সাথে এটি সহজেই যুক্ত করতে পারি। আমি এই নতুন এপিআই-তে কী মিস করছি সে সম্পর্কে আমি আরও কৌতূহলী।


এখানে একটি গিটহাব প্রকল্প রয়েছে যাতে সুইফট স্ট্রিং ম্যানিপুলেশনের জন্য প্রচুর এক্সটেনশন পদ্ধতি রয়েছে: github.com/iamjono/SwiftString
RenniePet

আমি যে সর্বোত্তম প্রয়োগটি পেয়েছি তা এখানে: stackoverflow.com/a/32306142/4550651
কার্লোস গার্সিয়া

আপনার কি ইউনিকোড কোডপয়েন্টস এবং বর্ধিত গ্রাফি ক্লাস্টারগুলির মধ্যে পার্থক্য করা দরকার?
বেন লেগিগেরো

উত্তর:


248

আপনি একমাত্র তিনিই নন যে সমাধানটি খুঁজে পেলেন না।

Stringবাস্তবায়ন নেই RandomAccessIndexType। সম্ভবত কারণ তারা বিভিন্ন বাইট দৈর্ঘ্য সহ অক্ষর সক্ষম করে। এজন্য অক্ষরের সংখ্যা পেতে আমাদের ব্যবহার করতে হবে string.characters.count( countবা countElementsসুইফট 1.x এ)। এটি পজিশনেও প্রযোজ্য। _positionসম্ভবত বাইটের কাঁচা অ্যারের মধ্যে একটি সূচক এবং তারা যে তা প্রকাশ করার চাই না। এর String.Indexঅর্থ হ'ল অক্ষরের মাঝে বাইট অ্যাক্সেস করা থেকে রক্ষা করা।

এর অর্থ হ'ল যে সূচি আপনি পেয়েছেন তা অবশ্যই তৈরি String.startIndexবা String.endIndex( String.Indexসরঞ্জাম BidirectionalIndexType) থেকে তৈরি করা উচিত । অন্য কোনও সূচকগুলি ব্যবহার করে successorবা predecessorপদ্ধতিগুলি তৈরি করা যেতে পারে ।

সূচকগুলিতে আমাদের সহায়তা করতে এখন বিভিন্ন পদ্ধতির একটি সেট রয়েছে (সুইফট 1.x এ ফাংশন):

সুইফট 4.x

let text = "abc"
let index2 = text.index(text.startIndex, offsetBy: 2) //will call succ 2 times
let lastChar: Character = text[index2] //now we can index!

let characterIndex2 = text.index(text.startIndex, offsetBy: 2)
let lastChar2 = text[characterIndex2] //will do the same as above

let range: Range<String.Index> = text.range(of: "b")!
let index: Int = text.distance(from: text.startIndex, to: range.lowerBound)

সুইফট 3.0

let text = "abc"
let index2 = text.index(text.startIndex, offsetBy: 2) //will call succ 2 times
let lastChar: Character = text[index2] //now we can index!

let characterIndex2 = text.characters.index(text.characters.startIndex, offsetBy: 2)
let lastChar2 = text.characters[characterIndex2] //will do the same as above

let range: Range<String.Index> = text.range(of: "b")!
let index: Int = text.distance(from: text.startIndex, to: range.lowerBound)

সুইফট 2.x

let text = "abc"
let index2 = text.startIndex.advancedBy(2) //will call succ 2 times
let lastChar: Character = text[index2] //now we can index!
let lastChar2 = text.characters[index2] //will do the same as above

let range: Range<String.Index> = text.rangeOfString("b")!
let index: Int = text.startIndex.distanceTo(range.startIndex) //will call successor/predecessor several times until the indices match

সুইফট 1.x

let text = "abc"
let index2 = advance(text.startIndex, 2) //will call succ 2 times
let lastChar: Character = text[index2] //now we can index!

let range = text.rangeOfString("b")
let index: Int = distance(text.startIndex, range.startIndex) //will call succ/pred several times

নিয়ে কাজ করা String.Indexকষ্টকর কিন্তু পূর্ণসংখ্যার দ্বারা সূচক করার জন্য একটি মোড়কের ব্যবহার (দেখতে https://stackoverflow.com/a/25152652/669586 ) বিপজ্জনক কারণ এটি বাস্তব ইন্ডেক্স অদক্ষতা লুকিয়ে রাখে।

নোট করুন যে সুইফট ইনডেক্সিং বাস্তবায়নের ক্ষেত্রে এমন সমস্যা রয়েছে যা একটি স্ট্রিংয়ের জন্য তৈরি সূচকগুলি / রেঞ্জগুলি নির্ভরযোগ্যভাবে আলাদা স্ট্রিংয়ের জন্য ব্যবহার করা যায় না , উদাহরণস্বরূপ:

সুইফট 2.x

let text: String = "abc"
let text2: String = "🎾🏇🏈"

let range = text.rangeOfString("b")!

//can randomly return a bad substring or throw an exception
let substring: String = text2[range]

//the correct solution
let intIndex: Int = text.startIndex.distanceTo(range.startIndex)
let startIndex2 = text2.startIndex.advancedBy(intIndex)
let range2 = startIndex2...startIndex2

let substring: String = text2[range2]

সুইফট 1.x

let text: String = "abc"
let text2: String = "🎾🏇🏈"

let range = text.rangeOfString("b")

//can randomly return nil or a bad substring 
let substring: String = text2[range] 

//the correct solution
let intIndex: Int = distance(text.startIndex, range.startIndex)    
let startIndex2 = advance(text2.startIndex, intIndex)
let range2 = startIndex2...startIndex2

let substring: String = text2[range2]  

1
বিশ্রী মনে হয়েছিল এটি হতে পারে, এটি উত্তর বলে মনে হচ্ছে। আশা করা যায় যে এই দুটি পরিসীমা ফাংশন এটি চূড়ান্ত প্রকাশের কিছু আগে ডকুমেন্টেশনে তৈরি করবে।
ম্যাট ওয়াইল্ডিং

কি ধরনের rangeমধ্যেvar range = text.rangeOfString("b")
zaph

5
@Zaph প্রতিটি Collectionটি typealias IndexType। অ্যারে জন্য, এটি হিসাবে সংজ্ঞায়িত করা হয় Intজন্য, Stringএটা হিসাবে সংজ্ঞায়িত করা হয় String.Index। অ্যারে এবং স্ট্রিং উভয়ই ব্যাপ্তি ব্যবহার করতে পারে (সাবারি এবং সাবস্ট্রিংগুলি তৈরি করতে)। পরিসরটি একটি বিশেষ ধরণের Range<T>। স্ট্রিংগুলির জন্য, এটি Range<String.Index>অ্যারেগুলির জন্য Range<Int>
সুলতান

1
ইন Swift 2.0, distance(text.startIndex, range.startIndex)হয়ে যায়text.startIndex.distanceTo(range.startIndex)
superarts.org

1
@ ডিভিওস String, হ'ল NSStringফাউন্ডেশনের মতো একটি পদ্ধতিও বলে hasPrefix(_:)
সুলতান

86

সুইফট ৩.০ এটিকে কিছুটা ভার্বোজ করে:

let string = "Hello.World"
let needle: Character = "."
if let idx = string.characters.index(of: needle) {
    let pos = string.characters.distance(from: string.startIndex, to: idx)
    print("Found \(needle) at position \(pos)")
}
else {
    print("Not found")
}

এক্সটেনশান:

extension String {
    public func index(of char: Character) -> Int? {
        if let idx = characters.index(of: char) {
            return characters.distance(from: startIndex, to: idx)
        }
        return nil
    }
}

ইন সুইফট 2.0 এই সহজ হয়ে করেছেন:

let string = "Hello.World"
let needle: Character = "."
if let idx = string.characters.indexOf(needle) {
    let pos = string.startIndex.distanceTo(idx)
    print("Found \(needle) at position \(pos)")
}
else {
    print("Not found")
}

এক্সটেনশান:

extension String {
    public func indexOfCharacter(char: Character) -> Int? {
        if let idx = self.characters.indexOf(char) {
            return self.startIndex.distanceTo(idx)
        }
        return nil
    }
}

সুইফট 1.x বাস্তবায়ন:

খাঁটি সুইফ্ট সমাধানের জন্য যে কেউ এটি ব্যবহার করতে পারেন:

let string = "Hello.World"
let needle: Character = "."
if let idx = find(string, needle) {
    let pos = distance(string.startIndex, idx)
    println("Found \(needle) at position \(pos)")
}
else {
    println("Not found")
}

এর এক্সটেনশন হিসাবে String:

extension String {
    public func indexOfCharacter(char: Character) -> Int? {
        if let idx = find(self, char) {
            return distance(self.startIndex, idx)
        }
        return nil
    }
}

1
চরিত্রগুলি হ্রাস করা হয় !!
শিবাম পোখরিয়াল

23
extension String {

    // MARK: - sub String
    func substringToIndex(index:Int) -> String {
        return self.substringToIndex(advance(self.startIndex, index))
    }
    func substringFromIndex(index:Int) -> String {
        return self.substringFromIndex(advance(self.startIndex, index))
    }
    func substringWithRange(range:Range<Int>) -> String {
        let start = advance(self.startIndex, range.startIndex)
        let end = advance(self.startIndex, range.endIndex)
        return self.substringWithRange(start..<end)
    }

    subscript(index:Int) -> Character{
        return self[advance(self.startIndex, index)]
    }
    subscript(range:Range<Int>) -> String {
        let start = advance(self.startIndex, range.startIndex)
            let end = advance(self.startIndex, range.endIndex)
            return self[start..<end]
    }


    // MARK: - replace
    func replaceCharactersInRange(range:Range<Int>, withString: String!) -> String {
        var result:NSMutableString = NSMutableString(string: self)
        result.replaceCharactersInRange(NSRange(range), withString: withString)
        return result
    }
}

7
এটি করার বিষয়ে ভেবেছিলেন, তবে আমি মনে করি এটি এমন একটি সমস্যা যা এটি স্ট্রিং অ্যাক্সেসের শব্দার্থকে আড়াল করে। লিঙ্কিত তালিকাগুলি অ্যাক্সেসের জন্য এমন একটি এপিআই তৈরির কল্পনা করুন যা অ্যারের জন্য এপিআইয়ের মতো লাগে। লোকেরা মারাত্মকভাবে অদক্ষ কোড লিখতে চায়।
এরিক এনহিম

16

আমি এই সমাধানটি সুইফট 2 এর জন্য খুঁজে পেয়েছি:

var str = "abcdefghi"
let indexForCharacterInString = str.characters.indexOf("c") //returns 2

সূচকটি কী হবে যখন str = "abcdefgchi"
শুক্ল

10

সুইফ্ট 5.0

public extension String {  
  func indexInt(of char: Character) -> Int? {
    return firstIndex(of: char)?.utf16Offset(in: self)
  }
}

সুইফট 4.0

public extension String {  
  func indexInt(of char: Character) -> Int? {
    return index(of: char)?.encodedOffset        
  }
}

রিটার্ন ইনডেক্স (এর: উপাদান) ma মানচিত্র {লক্ষ্য.distance (থেকে: startIndex, থেকে: $ 0)}
frogcjn

8

আমি স্ট্রিং.আইএনডেক্স থেকে অবস্থানটি কীভাবে সরিয়ে নেব তা নিশ্চিত নই, তবে আপনি যদি কিছু উদ্দেশ্য-সি ফ্রেমওয়ার্কে পিছিয়ে যেতে চান তবে আপনি অবজেক্টি-সি তে পৌঁছতে পারেন এবং আপনি যেমন ব্যবহার করেছিলেন ঠিক তেমনভাবে করতে পারেন।

"abcdefghi".bridgeToObjectiveC().rangeOfString("c").location

দেখে মনে হচ্ছে কিছু এনএসএসটিং পদ্ধতি এখনও স্ট্রিংয়ে পোর্ট করা হয়নি (বা সম্ভবত হবে না)। ধারণগুলিও মনে আসে।


এটি প্রকৃতপক্ষে উপস্থিত হয় যে রিটার্ন মানটির অবস্থানের সম্পত্তিটি অ্যাক্সেস করা সংকলকটির জন্য এনএসএস স্ট্রিংয়ের ধরন নির্ধারণের জন্য যথেষ্ট, তাই bridgeToObjectiveC()কলটির প্রয়োজন হয় না। rangeOfStringপূর্ববর্তী বিদ্যমান সুইফ্ট স্ট্রিংকে কল করার সময় আমার সমস্যাটি কেবল প্রকাশিত বলে মনে হচ্ছে । এপিআই ইস্যুর মতো মনে হচ্ছে ...
ম্যাট ওয়াইল্ডিং

ইহা আকর্ষণীয়. আমি জানি না যে এই ক্ষেত্রে এটি অনুমান করা হয়। ভাল যখন এটি ইতিমধ্যে একটি স্ট্রিং থাকে আপনি সর্বদা সেতুটি ব্যবহার করতে পারেন।
কনার

8

এখানে একটি পরিষ্কার স্ট্রিং এক্সটেনশন যা প্রশ্নের উত্তর দেয়:

সুইফট 3:

extension String {
    var length:Int {
        return self.characters.count
    }

    func indexOf(target: String) -> Int? {

        let range = (self as NSString).range(of: target)

        guard range.toRange() != nil else {
            return nil
        }

        return range.location

    }
    func lastIndexOf(target: String) -> Int? {



        let range = (self as NSString).range(of: target, options: NSString.CompareOptions.backwards)

        guard range.toRange() != nil else {
            return nil
        }

        return self.length - range.location - 1

    }
    func contains(s: String) -> Bool {
        return (self.range(of: s) != nil) ? true : false
    }
}

সুইফট ২.২:

extension String {    
    var length:Int {
        return self.characters.count
    }

    func indexOf(target: String) -> Int? {

        let range = (self as NSString).rangeOfString(target)

        guard range.toRange() != nil else {
            return nil
        }

        return range.location

    }
    func lastIndexOf(target: String) -> Int? {



        let range = (self as NSString).rangeOfString(target, options: NSStringCompareOptions.BackwardsSearch)

        guard range.toRange() != nil else {
            return nil
        }

        return self.length - range.location - 1

    }
    func contains(s: String) -> Bool {
        return (self.rangeOfString(s) != nil) ? true : false
    }
}

7

আপনি এইরকম একক স্ট্রিংয়ে কোনও অক্ষরের সূচিও খুঁজে পেতে পারেন,

extension String {

  func indexes(of character: String) -> [Int] {

    precondition(character.count == 1, "Must be single character")

    return self.enumerated().reduce([]) { partial, element  in
      if String(element.element) == character {
        return partial + [element.offset]
      }
      return partial
    }
  }

}

যা ফলাফল [স্ট্রিং.ডেসটেন্স] অর্থাৎ দেয়। [ইনট], মত

"apple".indexes(of: "p") // [1, 2]
"element".indexes(of: "e") // [0, 2, 4]
"swift".indexes(of: "j") // []

5

আপনি যদি পরিচিত এনএসএসস্ট্রিং ব্যবহার করতে চান তবে আপনি এটিকে স্পষ্টভাবে ঘোষণা করতে পারেন:

var someString: NSString = "abcdefghi"

var someRange: NSRange = someString.rangeOfString("c")

সুইফটে কীভাবে এটি করা যায় তা আমি নিশ্চিত নই।


1
এটি অবশ্যই কাজ করে এবং দেখে মনে হয় যে সংকলকটি আপনার জন্য এনএসএস স্ট্রিংয়ের ধরণগুলি অনুমান করাতে বেশ আগ্রাসী। আমি সত্যিই এটি করার খাঁটি সুইফ্ট পদ্ধতির জন্য প্রত্যাশা করছিলাম, যেহেতু এটি সাধারণভাবে ব্যবহারের মতো সাধারণ ক্ষেত্রে মনে হয়।
ম্যাট ওয়াইল্ডিং

হ্যাঁ, আমি চারপাশে খুঁজছি, কিন্তু আমি এটি দেখতে পাচ্ছি না। তারা ওজেজেসি সমর্থিত নয় এমন জায়গাগুলিতে তাদের দৃষ্টি নিবদ্ধ করা সম্ভব কারণ তারা এই শূন্যস্থানগুলি পূরণ করতে পারে ডাব্লু / ও অনেকগুলি ক্ষমতা হারিয়ে গেছে।
লোগান


3

আমি জানি এটি পুরানো এবং একটি উত্তর গৃহীত হয়েছে, তবে আপনি কোডটি কয়েক লাইনে স্ট্রিংয়ের সূচকটি খুঁজে পেতে পারেন:

var str : String = "abcdefghi"
let characterToFind: Character = "c"
let characterIndex = find(str, characterToFind)  //returns 2

সুইফট স্ট্রিং সম্পর্কে আরও কিছু দুর্দান্ত তথ্য এখানে স্ট্রিংস সুইফটে


findসুইফট 3
আমিরআর

2

এটি আমার পক্ষে কাজ করেছে,

var loc = "abcdefghi".rangeOfString("c").location
NSLog("%d", loc);

এটিও কাজ করেছে,

var myRange: NSRange = "abcdefghi".rangeOfString("c")
var loc = myRange.location
NSLog("%d", loc);

এই দু'টিই কোনওভাবে এনএসএসস্ট্রিংয়ের আচরণে ফ্যালব্যাক বলে মনে হচ্ছে। আমার খেলার মাঠে, আমি স্ট্রিংয়ের জন্য একটি মধ্যবর্তী পরিবর্তনশীল ব্যবহার করছিলাম। var str = "abcdef"; str.rangeOfString("c").locationস্ট্রিং সম্পর্কে ত্রুটি উত্থাপন করে nd সূচিপত্রটির নাম অনুসারে লোকেশন না থাকা ...
ম্যাট ওয়াইল্ডিং

1
এটি কেবলমাত্র কাজ করে কারণ "স্ট্রিং"
এনএসএসস্ট্রিং

2

সোফ্টে ভেরিয়েবল টাইপ স্ট্রিংয়ে উদ্দেশ্য-সি-তে এনএসএসস্ট্রিংয়ের তুলনায় বিভিন্ন ফাংশন রয়েছে। এবং যেমন সুলতান উল্লেখ করেছেন,

সুইফ্ট স্ট্রিং র‌্যান্ডমএকসেসইন্ডেক্স কার্যকর করে না

আপনি যা করতে পারেন তা হ'ল স্ট্রিং টু এনএসএসআরং টাইপের ধরণের পরিবর্তনশীল (এটি সুইফ্টে বৈধ)। এটি আপনাকে এনএসএসস্ট্রিংয়ের ফাংশনগুলিতে অ্যাক্সেস দেবে।

var str = "abcdefghi" as NSString
str.rangeOfString("c").locationx   // returns 2

2

আপনি যদি এটির বিষয়ে চিন্তা করেন তবে আপনার সত্যিকার অর্থে অবস্থানটির সঠিক ইন্টার সংস্করণ দরকার নেই। রেঞ্জ বা এমনকি স্ট্রিং.ইনডেক্স প্রয়োজন হলে আবার স্ট্রিংগুলি বের করার জন্য যথেষ্ট:

let myString = "hello"

let rangeOfE = myString.rangeOfString("e")

if let rangeOfE = rangeOfE {
    myString.substringWithRange(rangeOfE) // e
    myString[rangeOfE] // e

    // if you do want to create your own range
    // you can keep the index as a String.Index type
    let index = rangeOfE.startIndex
    myString.substringWithRange(Range<String.Index>(start: index, end: advance(index, 1))) // e

    // if you really really need the 
    // Int version of the index:
    let numericIndex = distance(index, advance(index, 1)) // 1 (type Int)
}

> আন্তর্জাতিক {ফিরতি (NSString যেমন স্ব) .rangeOfString (লক্ষ্য) .location} -: আমার জন্য সবচেয়ে ভালো উত্তর যে func indexOf মধ্যে (স্ট্রিং লক্ষ্য) হয়
YannSteph

2

সরলতম উপায়:

ইন সুইফট 3 :

 var textViewString:String = "HelloWorld2016"
    guard let index = textViewString.characters.index(of: "W") else { return }
    let mentionPosition = textViewString.distance(from: index, to: textViewString.endIndex)
    print(mentionPosition)

1

স্ট্রিং এনএসএসস্ট্রিংয়ের জন্য একটি সেতুর ধরণ, সুতরাং যুক্ত করুন

import Cocoa

আপনার সুইফ্ট ফাইলটিতে এবং সমস্ত "পুরানো" পদ্ধতি ব্যবহার করুন।


1

চিন্তার দিক থেকে এটিকে ইনভারশন বলা যেতে পারে। আপনি আবিষ্কার করেছেন যে ফ্ল্যাটটির পরিবর্তে বিশ্বটি গোলাকার। "চরিত্রটির আইএনডেক্স এটির সাথে কাজ করার জন্য আপনাকে সত্যিকারের জানা দরকার নেই।" এবং একজন সি প্রোগ্রামার হিসাবে আমি দেখতে পেলাম যে খুব কঠিন! আপনার লাইনটি "সূচী = চিঠিগুলি দিন rac নিজেই যথেষ্ট। উদাহরণস্বরূপ যে সিটি আপনি ব্যবহার করতে পারেন তা সরানোর জন্য ... (খেলার মাঠের আটকানো)

    var letters = "abcdefg"
  //let index = letters.rangeOfString("c")!.startIndex //is the same as
    let index = letters.characters.indexOf("c")!
    range = letters.characters.indexOf("c")!...letters.characters.indexOf("c")!
    letters.removeRange(range)
    letters

যাইহোক, আপনি যদি একটি সূচক চান তবে আপনাকে কোনও প্রকৃত INDEX ফিরিয়ে দিতে হবে কোনও इंट মান হিসাবে কোনও আন্ত নয় কোনও ব্যবহারিক ব্যবহারের জন্য অতিরিক্ত পদক্ষেপের প্রয়োজন হবে। এই এক্সটেনশানগুলি একটি সূচক, একটি নির্দিষ্ট চরিত্রের একটি গণনা এবং এই খেলার মাঠের প্লাগ-ইন-সক্ষম কোডটি প্রদর্শন করবে এমন একটি পরিসীমা ফেরত দেয়।

extension String
{
    public func firstIndexOfCharacter(aCharacter: Character) -> String.CharacterView.Index? {

        for index in self.characters.indices {
            if self[index] == aCharacter {
                return index
            }

        }
        return nil
    }

    public func returnCountOfThisCharacterInString(aCharacter: Character) -> Int? {

        var count = 0
        for letters in self.characters{

            if aCharacter == letters{

                count++
            }
        }
        return count
    }


    public func rangeToCharacterFromStart(aCharacter: Character) -> Range<Index>? {

        for index in self.characters.indices {
            if self[index] == aCharacter {
                let range = self.startIndex...index
                return range
            }

        }
        return nil
    }

}



var MyLittleString = "MyVery:important String"

var theIndex = MyLittleString.firstIndexOfCharacter(":")

var countOfColons = MyLittleString.returnCountOfThisCharacterInString(":")

var theCharacterAtIndex:Character = MyLittleString[theIndex!]

var theRange = MyLittleString.rangeToCharacterFromStart(":")
MyLittleString.removeRange(theRange!)

1

সুইফট 4 সম্পূর্ণ সমাধান:

অফসেটইন্ডেজেবল কালেকশন (ইনড ইনডেক্স ব্যবহার করে স্ট্রিং)

https://github.com/frogcjn/OffsetIndexableCollection-String-Int-Indexable-

let a = "01234"

print(a[0]) // 0
print(a[0...4]) // 01234
print(a[...]) // 01234

print(a[..<2]) // 01
print(a[...2]) // 012
print(a[2...]) // 234
print(a[2...3]) // 23
print(a[2...2]) // 2

if let number = a.index(of: "1") {
    print(number) // 1
    print(a[number...]) // 1234
}

if let number = a.index(where: { $0 > "1" }) {
    print(number) // 2
}

1

স্ট্রিং extension

//Fucntion to get the index of a particular string
func index(of target: String) -> Int? {
    if let range = self.range(of: target) {
        return characters.distance(from: startIndex, to: range.lowerBound)
    } else {
        return nil
    }
}
//Fucntion to get the last index of occurence of a given string
func lastIndex(of target: String) -> Int? {
    if let range = self.range(of: target, options: .backwards) {
        return characters.distance(from: startIndex, to: range.lowerBound)
    } else {
        return nil
    }
}

}


1

সুইফট 5

সাবস্ট্রিংয়ের সূচি সন্ধান করুন

let str = "abcdecd"
if let range: Range<String.Index> = str.range(of: "cd") {
    let index: Int = str.distance(from: str.startIndex, to: range.lowerBound)
    print("index: ", index) //index: 2
}
else {
    print("substring not found")
}

চরিত্রের সূচকটি সন্ধান করুন

let str = "abcdecd"
if let firstIndex = str.firstIndex(of: "c") {
    let index: Int = str.distance(from: str.startIndex, to: firstIndex)
    print("index: ", index)   //index: 2
}
else {
    print("symbol not found")
}

0

আপনি যদি এই লাইব্রেরিতে অক্ষর বা স্ট্রিং চেকআউটের সূচক পেতে সহজ উপায়ের সন্ধান করছেন http://www.dolilerswift.org/#indexof-char-character-int

আপনি স্ট্রিং থেকে অন্য স্ট্রিং বা রেজেক্স প্যাটার্ন ব্যবহার করে সূচিপত্র পেতে পারেন


0

সুইফট 2 দিয়ে একটি স্ট্রিংয়ের একটি স্ট্রিংয়ের সূচক পেতে:

let text = "abc"
if let range = text.rangeOfString("b") {
   var index: Int = text.startIndex.distanceTo(range.startIndex) 
   ...
}

0

দ্রুত 2.0. এ

var stringMe="Something In this.World"
var needle="."
if let idx = stringMe.characters.indexOf(needle) {
    let pos=stringMe.substringFromIndex(idx)
    print("Found \(needle) at position \(pos)")
}
else {
    print("Not found")
}

0
let mystring:String = "indeep";
let findCharacter:Character = "d";

if (mystring.characters.contains(findCharacter))
{
    let position = mystring.characters.indexOf(findCharacter);
    NSLog("Position of c is \(mystring.startIndex.distanceTo(position!))")

}
else
{
    NSLog("Position of c is not found");
}

0

আমি নিম্নলিখিত সঙ্গে খেলি

extension String {
    func allCharactes() -> [Character] {
         var result: [Character] = []
         for c in self.characters {
             result.append(c)
         }
         return 
    }
}

যতক্ষণ না আমি প্রদত্ত ব্যক্তির এখন পর্যন্ত বুঝতে পারি এটি কেবল চরিত্রের অ্যারে

এবং সাথে

let c = Array(str.characters)

এটি কী অর্জন করে? আপনার প্রথম কোডটি কীভাবে দ্বিতীয়টির চেয়ে ভাল?
বেন লেগিগিরো

0

আপনার যদি কেবলমাত্র একটি চরিত্রের সূচি সবচেয়ে সহজ, দ্রুত সমাধান (যেমন ইতিমধ্যে পাস্কাল দ্বারা চিহ্নিত) হ'ল:

let index = string.characters.index(of: ".")
let intIndex = string.distance(from: string.startIndex, to: index)

চরিত্রগুলি এখন অবচয় করা হয়েছে ... দুঃখের বিষয়, এমনকি যদি এটি কাজ করে
ব্যবহারকারী 3069232

0

একটি বাঁক বিষয় String.Indexএকটি মধ্যে Int, এই এক্সটেনশানটি আমার জন্য কাজ করে:

public extension Int {
    /// Creates an `Int` from a given index in a given string
    ///
    /// - Parameters:
    ///    - index:  The index to convert to an `Int`
    ///    - string: The string from which `index` came
    init(_ index: String.Index, in string: String) {
        self.init(string.distance(from: string.startIndex, to: index))
    }
}

এই প্রশ্নের সাথে সম্পর্কিত ব্যবহারের উদাহরণ:

var testString = "abcdefg"

Int(testString.range(of: "c")!.lowerBound, in: testString)     // 2

testString = "🇨🇦🇺🇸🇩🇪👩‍👩‍👧‍👦\u{1112}\u{1161}\u{11AB}"

Int(testString.range(of: "🇨🇦🇺🇸🇩🇪")!.lowerBound, in: testString) // 0
Int(testString.range(of: "👩‍👩‍👧‍👦")!.lowerBound, in: testString)    // 1
Int(testString.range(of: "한")!.lowerBound, in: testString)    // 5

গুরুত্বপূর্ণ:

আপনি বলতে পারেন যে এটি গ্রাফিম ক্লাস্টারগুলিকে গ্রুপ করেছে এবং এর চেয়ে আলাদা আলাদাভাবে চরিত্রগুলিতে যোগদান করেছে String.Index। অবশ্যই, আমরা এই কারণ String.Index। আপনার মনে রাখা উচিত যে এই পদ্ধতিটি ক্লাস্টারগুলিকে একক চরিত্র হিসাবে বিবেচনা করে, যা সংশোধনের কাছাকাছি। যদি আপনার লক্ষ্যটি ইউনিকোড কোডপয়েন্ট দ্বারা একটি স্ট্রিংকে বিভক্ত করা হয় তবে এটি আপনার পক্ষে সমাধান নয়।


0

ইন সুইফট 2.0 , নিম্নলিখিত ফাংশন একটি প্রদত্ত চরিত্র সামনে একটি সাবস্ট্রিং দেখায়।

func substring(before sub: String) -> String {
    if let range = self.rangeOfString(sub),
        let index: Int = self.startIndex.distanceTo(range.startIndex) {
        return sub_range(0, index)
    }
    return ""
}

0

আপনি এটির সাথে একটি স্ট্রিং-এ একটি অক্ষরের সূচক সংখ্যাটি খুঁজে পেতে পারেন:

var str = "abcdefghi"
if let index = str.firstIndex(of: "c") {
    let distance = str.distance(from: str.startIndex, to: index)
    // distance is 2
}

0

আমার দৃষ্টিকোণ হিসাবে, যুক্তি নিজেই জানার আরও ভাল উপায় নীচে is

 let testStr: String = "I love my family if you Love us to tell us I'm with you"
 var newStr = ""
 let char:Character = "i"

 for value in testStr {
      if value == char {
         newStr = newStr + String(value)
   }

}
print(newStr.count)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.