স্ট্রিং স্ট্রিং কীভাবে সুইফটে কাজ করে


354

আমি আমার পুরানো কিছু কোড এবং উত্তরগুলি সুইফট 3 এর সাথে আপডেট করছি কিন্তু যখন আমি সুইফট স্ট্রিংগুলিতে এবং সাবস্ট্রিংয়ের সাথে সূচীকরণের জিনিসগুলি বিভ্রান্তিকর হয়ে উঠলাম।

বিশেষত আমি নিম্নলিখিতটি চেষ্টা করছিলাম:

let str = "Hello, playground"
let prefixRange = str.startIndex..<str.startIndex.advancedBy(5)
let prefix = str.substringWithRange(prefixRange)

যেখানে দ্বিতীয় লাইনটি আমাকে নিম্নলিখিত ত্রুটি দিচ্ছে

'স্ট্রিং' ধরণের মানটির কোনও সদস্য 'সাবস্ট্রিংউথথ্যাঞ্জ' নেই

আমি দেখতে পাই যে Stringএখন নিম্নলিখিত পদ্ধতি রয়েছে:

str.substring(to: String.Index)
str.substring(from: String.Index)
str.substring(with: Range<String.Index>)

এগুলি প্রথমে আমাকে সত্যিই বিভ্রান্ত করেছিল তাই আমি সূচি এবং ব্যাপ্তির চারপাশে খেলতে শুরু করি । এটি স্ট্রিংয়ের জন্য অনুসরণীয় প্রশ্ন এবং উত্তর। সেগুলি কীভাবে ব্যবহৃত হয় তা দেখানোর জন্য আমি নীচে একটি উত্তর যুক্ত করছি।



বা সাবস্ক্রিপ্ট স্ট্রিং বা সাবস্ট্রিং stackoverflow.com/questions/24092884/...
লিও Dabus

উত্তর:


831

এখানে চিত্র বর্ণনা লিখুন

নীচের সমস্ত উদাহরণ ব্যবহার করে

var str = "Hello, playground"

সুইফট 4

স্ট্রিংসটি সুইফট ৪-এ একটি দুর্দান্ত বড় রূপরেখা পেয়েছে যখন আপনি এখন কোনও স্ট্রিং থেকে কিছু সাবস্ট্রিং পান, আপনি একটি Substringপরিবর্তে টাইপ ফিরে পাবেন String। কেন? স্ট্রিংগুলি সুইফটে মান ধরণের। এর অর্থ আপনি যদি একটি নতুন স্ট্রিং ব্যবহার করতে একটি স্ট্রিং ব্যবহার করেন তবে তা অনুলিপি করতে হবে। এটি স্থায়িত্বের জন্য ভাল (আপনার জ্ঞান ছাড়া অন্য কেউ এটিকে পরিবর্তন করবে না) তবে দক্ষতার জন্য খারাপ।

অন্যদিকে, একটি সাবস্ট্রিং হ'ল মূল স্ট্রিংয়ের কাছ থেকে এটি এসেছে came এখানে ডকুমেন্টেশন থেকে একটি চিত্র এটি চিত্রিত করে।

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

let myString = String(mySubstring)

এটি কেবল মাত্র স্ট্রিংগুলি অনুলিপি করবে এবং পুরানো স্ট্রিং ধারণকারী মেমরিটি পুনরুদ্ধার করা যায় । সাবস্ট্রিংগুলি (একটি প্রকার হিসাবে) স্বল্পজীবী হতে বোঝায়।

সুইফ্ট 4-এ আর একটি বড় উন্নতি হ'ল স্ট্রিংস হ'ল কালেকশন (আবার)। এর অর্থ হ'ল আপনি কোনও সংগ্রহে যা কিছু করতে পারেন, আপনি একটি স্ট্রিং (সাবস্ক্রিপ্টগুলি ব্যবহার করতে পারেন, অক্ষরগুলির উপর পুনরাবৃত্তি করতে চান, ফিল্টার ইত্যাদি) করতে পারেন।

নিম্নলিখিত উদাহরণগুলি কীভাবে সুইফটে সাবস্ট্রিং পাবেন তা দেখায়।

সাবস্ট্রিংগুলি প্রাপ্ত

আপনি (উদাহরণস্বরূপ, সাবস্ক্রিপ্টগুলোর বা অন্যান্য পদ্ধতির একটি সংখ্যা ব্যবহার করে একটি স্ট্রিং থেকে একটি সাবস্ট্রিং পেতে পারেন prefix, suffix, split)। যদিও আপনাকে এখনও ব্যাপ্তির জন্য String.Indexকোনও Intসূচক ব্যবহার করতে হবে না । ( আপনার যদি এর সাথে সাহায্যের দরকার হয় তবে আমার অন্য উত্তরটি দেখুন )

একটি স্ট্রিং শুরু

আপনি একটি সাবস্ক্রিপ্ট ব্যবহার করতে পারেন (সুইফট 4 একতরফা রেঞ্জ নোট করুন):

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

বা prefix:

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

বা আরও সহজ:

let mySubstring = str.prefix(5) // Hello

একটি স্ট্রিং শেষ

সাবস্ক্রিপ্ট ব্যবহার:

let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str[index...] // playground

বা suffix:

let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str.suffix(from: index) // playground

বা আরও সহজ:

let mySubstring = str.suffix(10) // playground

নোট করুন যে ব্যবহার করার সময় suffix(from: index)আমাকে ব্যবহার করে শেষ থেকে পিছনে গুনতে হয়েছিল -10। এটি ব্যবহার করার সময় প্রয়োজন হয় না suffix(x), যা কেবল xএকটি স্ট্রিংয়ের শেষ অক্ষর গ্রহণ করে ।

একটি স্ট্রিং মধ্যে ব্যাপ্তি

আবার আমরা কেবল এখানে সাবস্ক্রিপ্ট ব্যবহার করি।

let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -6)
let range = start..<end

let mySubstring = str[range]  // play

রূপান্তরিত Substringহচ্ছেString

ভুলে যাবেন না, যখন আপনি নিজের সাবস্ট্রিং সংরক্ষণ করতে প্রস্তুত হন, আপনার এটিকে এমন রূপান্তর করা উচিত Stringযাতে পুরানো স্ট্রিংয়ের স্মৃতি পরিষ্কার হয়ে যায়।

let myString = String(mySubstring)

একটি Intসূচক এক্সটেনশন ব্যবহার করছেন ?

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

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


9
ডেসক্রিপশন জন্য Thx। ভাল আপরেটস প্রাপ্য। অ্যাপল এটি overcomplicated। সাবস্ট্রিং স্ট্রিং.সুবস্ট্রিংয়ের মতোই সহজ হতে হবে [... থেকে]।
টেডি

সত্যিই ভাল ব্যাখ্যা। একটি ছোট জিনিস ছাড়া garbage collected;-) আমি আশা করি যে এখানকার লোকেরা জেনে থাকতে পারেন যে সুইফটে কোনও জঞ্জাল সংগ্রহ নেই।
খ্রিস্টান অ্যাঙ্কর ড্যাম্পফ

@ ক্রিশ্চিয়ান অ্যানচেস্টারড্যাম্পফ, মন্তব্য করার জন্য সময় দেওয়ার জন্য ধন্যবাদ। আমি আবর্জনা সংগ্রহ করেছি। নতুন শব্দটি কেমন?
সুরগাচ

কী আশ্চর্য উত্তর স্যার !!
দেবিদেব

194

আমি সুইফ্টের স্ট্রিং অ্যাক্সেস মডেলটিতে সত্যিই হতাশ: সবকিছুই একটি হতে হবে Index। আমি কেবল চাই স্ট্রিংয়ের আই-থ্রি চরিত্রটি অ্যাক্সেস করে Intনা, আনাড়ি সূচক এবং অগ্রগতি (যা প্রতিটি বড় রিলিজের সাথে পরিবর্তিত হয়)। সুতরাং আমি এতে একটি এক্সটেনশন করেছি String:

extension String {
    func index(from: Int) -> Index {
        return self.index(startIndex, offsetBy: from)
    }

    func substring(from: Int) -> String {
        let fromIndex = index(from: from)
        return String(self[fromIndex...])
    }

    func substring(to: Int) -> String {
        let toIndex = index(from: to)
        return String(self[..<toIndex])
    }

    func substring(with r: Range<Int>) -> String {
        let startIndex = index(from: r.lowerBound)
        let endIndex = index(from: r.upperBound)
        return String(self[startIndex..<endIndex])
    }
}

let str = "Hello, playground"
print(str.substring(from: 7))         // playground
print(str.substring(to: 5))           // Hello
print(str.substring(with: 7..<11))    // play

5
সূচিগুলি খুব দরকারী কারণ একটি অক্ষর একাধিক বাইট হতে পারে। চেষ্টা করুনlet str = "🇨🇭🇩🇪🇺🇸Hello" print(str.substring(to: 2))
ভাদিয়ান

110
হ্যাঁ, আমি বুঝতে পারি যে একটি অক্ষর (অর্থাত্ প্রসারিত গ্রাফি ক্লাস্টার ) একাধিক বাইট নিতে পারে। আমার হতাশা হ'ল স্ট্রিংয়ের অক্ষরগুলি অ্যাক্সেস করতে আমাদের ভার্বোজ সূচক-অগ্রগতি পদ্ধতিটি ব্যবহার করতে হবে। সুইফট টিম কেন কোর লাইব্রেরিতে এটিকে বিমূর্ত করতে কেবল কিছু ওভারলোড যুক্ত করতে পারে না। যদি আমি টাইপ করি তবে আমি str[5]সূচক 5 তে অক্ষরটি অ্যাক্সেস করতে চাই, যে চরিত্রটি প্রদর্শিত হবে বা এটি কতগুলি বাইট নেয়। বিকাশকের উত্পাদনশীলতা সম্পর্কে কি সুইফট নয়?
কোড আলাদা

6
@ রেনিপেট আমি বিশ্বাস করি অ্যাপল সমস্যাটিকে স্বীকৃতি দিয়েছে এবং পরিবর্তনগুলি আসছে। গিটহাবের সুইফ্ট বিবর্তন পৃষ্ঠা অনুসারে: "সুইফট 4 স্ট্রিংগুলিকে আরও শক্তিশালী এবং সহজেই ব্যবহারযোগ্য করে তুলতে চেষ্টা করে, যখন ইউনিকোডের ডিফল্টরূপে নির্ভুলতা ধরে রাখে"। এটি অস্পষ্ট তবে আসুন আমরা আমাদের আশা
কোড আলাদা করুন Code

3
@ কোডডেফেল কেন আপেল সাবস্ক্রিপ্টের অক্ষর অ্যাক্সেস যোগ করেনি? যাতে লোকেরা বুঝতে পারে যে এটি করা খারাপ কাজ। মূলত যদি আপনি 0 .. স্ট্রিং.কাউন্টে আমি সাবস্ক্রিপ্টগুলি ব্যবহার করে যা ডাবল লুপ হতে পারে তবে হুড সূচীর অধীনে স্ট্রিংয়ের প্রতিটি বাইটের সাহায্যে পরবর্তী অক্ষরটি খুঁজে বের করতে হবে। আপনি যদি সূচক ব্যবহার করে লুপ করেন তবে আপনি একবারে স্ট্রিং দিয়ে পুনরাবৃত্তি করেন। বিটিডব্লিউ, এটিকে আমি নিজেই ঘৃণা করি, তবে সাবস্ক্রিপ্টটি দ্রুত স্ট্রিংয়ে উপলব্ধ না হওয়ার পিছনে যুক্তি এটি।
রায়মুন্দাস সাকালাউস্কাস

4
@ রায়মুন্ডাস সাকালাউস্কাস যে যুক্তি আমার দ্বারা উড়ে যায় না। সি # এর ইউনিকোড নির্ভুলতা এবং পূর্ণসংখ্যা সাবস্ক্রিপশন উভয়ই রয়েছে যা সত্যই সুবিধাজনক। সুইফ্ট 1-এ, অ্যাপল ডেভেলপারদের countElement(str)দৈর্ঘ্য সন্ধান করতে ব্যবহার করতে চেয়েছিল । সুইফ্ট 3-এ, অ্যাপল স্ট্রিং মেনে চলেনি Sequenceএবং str.charactersপরিবর্তে সবাইকে ব্যবহার করতে বাধ্য করেছিল । এই ছেলেরা পরিবর্তন করতে ভয় পায় না। সত্যিকারের বোঝার জন্য পূর্ণসংখ্যার সাবস্ক্রিপশনে তাদের
কোড ভিন্ন ভিন্ন

102

সুইফট 5 এক্সটেনশন:

extension String {
    subscript(_ range: CountableRange<Int>) -> String {
        let start = index(startIndex, offsetBy: max(0, range.lowerBound))
        let end = index(start, offsetBy: min(self.count - range.lowerBound, 
                                             range.upperBound - range.lowerBound))
        return String(self[start..<end])
    }

    subscript(_ range: CountablePartialRangeFrom<Int>) -> String {
        let start = index(startIndex, offsetBy: max(0, range.lowerBound))
         return String(self[start...])
    }
}

ব্যবহার:

let s = "hello"
s[0..<3] // "hel"
s[3...]  // "lo"

অথবা ইউনিকোড:

let s = "😎🤣😋"
s[0..<1] // "😎"

2
আরও ভাল, এই এক্সটেনশন পোস্ট করার জন্য আপনাকে ধন্যবাদ! আমি মনে করি পাইথন থেকে আসছি, সুইফট অভ্যস্ত হওয়ার প্রয়োজনের চেয়ে অনেক বেশি শক্ত। এটি মনে হয় যে লোকেরা সি সি থেকে সুইফটে অন্য দিকে যাচ্ছেন সেখানে আরও ইতিবাচক নিশ্চিতকরণ রয়েছে।
ব্যবহারকারীর 3064009

1
@ লিওন আমি সবে এটি সরিয়েছি। 4.1 এর আগে countপাওয়া শুধুমাত্র ছিলself.characters
লু মধ্যে Zell

1
এই বিশেষ বর্ধনের সাথে নজর রাখার জন্য কি কোনও গেটছ আছে? অ্যাপল কেন এমন কিছু করেনি?
Andz

1
@ এন্ডজ এটি খুব অকার্যকর। এটি স্ট্রিংয়ের শুরু থেকে শুরু হয় - দুবার - এবং সেখান থেকে প্রতিটি চরিত্রকে "রেঞ্জ" - দুবার পার্স করতে হবে।
কারেমান

3
আপনি যেমন লিখতে চান তবে আপনাকে একটি এক্সটেনশনCountableClosedRange<Int> যুক্ত করতে হবে s[0...2]
ক্রিস ফ্রেডেরিক ২ '

24

সুইফ্ট 4 এবং 5:

extension String {
  subscript(_ i: Int) -> String {
    let idx1 = index(startIndex, offsetBy: i)
    let idx2 = index(idx1, offsetBy: 1)
    return String(self[idx1..<idx2])
  }

  subscript (r: Range<Int>) -> String {
    let start = index(startIndex, offsetBy: r.lowerBound)
    let end = index(startIndex, offsetBy: r.upperBound)
    return String(self[start ..< end])
  }

  subscript (r: CountableClosedRange<Int>) -> String {
    let startIndex =  self.index(self.startIndex, offsetBy: r.lowerBound)
    let endIndex = self.index(startIndex, offsetBy: r.upperBound - r.lowerBound)
    return String(self[startIndex...endIndex])
  }
}

এটি কিভাবে ব্যবহার করতে:

"abcde" [0] -> "ক"

"abcde" [0 ... 2] -> "এবিসি"

"abcde" [2 .. <4] -> "সিডি"


20

সুইফট 4

দ্রুতগতি 4 Stringকে কনর্ফাম করে করতে Collection। পরিবর্তে substring, এখন আমাদের একটি ব্যবহার করা উচিত subscript.তাই আপনি যদি কেবলমাত্র শব্দটি "play"থেকে বের করতে চান তবে আপনি "Hello, playground"এটি এটি করতে পারেন:

var str = "Hello, playground"
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -6)
let result = str[start..<end] // The result is of type Substring

এটি জেনে রাখা আকর্ষণীয়, এটি করা আপনাকে একটি এর Substringপরিবর্তে দেবে String। এটি মূল এবং স্ট্রিংয়ের Substringসাথে স্টোরেজ ভাগ করার কারণে এটি দ্রুত এবং দক্ষ । তবে এইভাবে মেমরি ভাগ করে নেওয়া সহজেই মেমরি ফাঁস হতে পারে।

আপনি মূল স্ট্রিংটি পরিষ্কার করতে চাইলে আপনার ফলাফলটি নতুন স্ট্রিংয়ে অনুলিপি করা উচিত। আপনি সাধারণ কনস্ট্রাক্টর ব্যবহার করে এটি করতে পারেন:

let newString = String(result)

আপনি নতুন Substringঅ্যাপ্লিকেশনটিতে [অ্যাপল ডকুমেন্টেশন] এ আরও তথ্য পেতে পারেন । 1

সুতরাং, উদাহরণস্বরূপ যদি আপনি Rangeএর ফলাফল হিসাবে একটি পান তবে NSRegularExpressionআপনি নিম্নলিখিত এক্সটেনশনটি ব্যবহার করতে পারেন:

extension String {

    subscript(_ range: NSRange) -> String {
        let start = self.index(self.startIndex, offsetBy: range.lowerBound)
        let end = self.index(self.startIndex, offsetBy: range.upperBound)
        let subString = self[start..<end]
        return String(subString)
    }

}

আপনার কোডটি ক্র্যাশ হয়ে যাবে যদি রেঞ্জ.উপারবাউন্ড> স্ট্রিংয়ের দৈর্ঘ্য। এছাড়াও, একটি নমুনার ব্যবহার পাশাপাশি সহায়ক হতে পারে, কারণ আমি সুইফটে সাবস্ক্রিপ্টগুলির সাথে পরিচিত ছিল না। আপনি তারিখ পার্টঅনলি = "2018-01-04-08: 00" [এনএসমেকরেঞ্জ (0, 10)] এর মতো কিছু অন্তর্ভুক্ত করতে পারেন। এটি বাদে খুব সুন্দর উত্তর, +1 :)।
ডিসিপি

আজকাল এটি এই অদ্ভুত জিনিস: text[Range( nsRange , in: text)!]
ফ্যাটি

10

এখানে একটি ফাংশন যা শুরু এবং শেষ সূচকগুলি সরবরাহ করা হয় তখন প্রদত্ত সাবস্ট্রিংয়ের সাবস্ট্রিং প্রদান করে। সম্পূর্ণ রেফারেন্সের জন্য আপনি নীচে দেওয়া লিঙ্কগুলি দেখতে পারেন।

func substring(string: String, fromIndex: Int, toIndex: Int) -> String? {
    if fromIndex < toIndex && toIndex < string.count /*use string.characters.count for swift3*/{
        let startIndex = string.index(string.startIndex, offsetBy: fromIndex)
        let endIndex = string.index(string.startIndex, offsetBy: toIndex)
        return String(string[startIndex..<endIndex])
    }else{
        return nil
    }
}

এই ব্লগ পোস্টের একটি লিঙ্ক যা আমি দ্রুতগতিতে স্ট্রিং ম্যানিপুলেশন মোকাবেলায় তৈরি করেছি। সুইফটে স্ট্রিং ম্যানিপুলেশন (তত দ্রুত সুইফ্টও )াকা)

অথবা আপনি গিথুবে এই টুকরোটি দেখতে পারেন


9

আমি একই প্রাথমিক প্রতিক্রিয়া ছিল। আমিও হতাশ হয়েছি যে প্রতিটি বড় রিলিজে সিনট্যাক্স এবং অবজেক্টগুলি এত মারাত্মকভাবে কীভাবে পরিবর্তিত হয়।

যাইহোক, আমি অভিজ্ঞতা থেকে উপলব্ধি করেছি যে আমি কীভাবে সর্বদা "পরিবর্তনের" সাথে লড়াই করার চেষ্টা করার ফলস্বরূপ বহু-বাইট চরিত্রগুলির সাথে ডিল করার মতো পরিণতি ভুগছি যা যদি আপনি বিশ্বব্যাপী দর্শকদের দিকে তাকান তবে অবশ্যম্ভাবী।

তাই আমি অ্যাপল ইঞ্জিনিয়ারদের দ্বারা প্রণীত প্রচেষ্টাকে স্বীকৃতি জানাতে এবং সম্মান করার সিদ্ধান্ত নিয়েছি এবং তারা যখন এই "ভয়াবহ" পদ্ধতির সাথে আসে তখন তাদের মানসিকতা বোঝার মাধ্যমে আমার অংশটি করার চেষ্টা করি।

আপনার জীবনকে সহজ করার জন্য (যা আমি ভুল বা ব্যয়বহুল তা বলছি না) এক্সটেনশনগুলি তৈরি করার পরিবর্তে স্ট্রিংগুলি কীভাবে কাজ করার জন্য ডিজাইন করা হয়েছে তা কেন খুঁজে বের করবেন না।

উদাহরণস্বরূপ, আমার এই কোডটি ছিল যা সুইফট ২.২ এ কাজ করছে:

let rString = cString.substringToIndex(2)
let gString = (cString.substringFromIndex(2) as NSString).substringToIndex(2)
let bString = (cString.substringFromIndex(4) as NSString).substringToIndex(2)

এবং সাবস্ট্রিংস ব্যবহার করে একই পদ্ধতির কাজ করার চেষ্টা ছেড়ে দেওয়ার পরে অবশেষে আমি স্ট্রিংসকে একটি দ্বিদ্বৈজ্ঞামূলক সংগ্রহ হিসাবে বিবেচনা করার ধারণাটি বুঝতে পেরেছিলাম যার জন্য আমি একই কোডটির এই সংস্করণটি দিয়ে শেষ করেছি:

let rString = String(cString.characters.prefix(2))
cString = String(cString.characters.dropFirst(2))
let gString = String(cString.characters.prefix(2))
cString = String(cString.characters.dropFirst(2))
let bString = String(cString.characters.prefix(2))

আমি আশা করি এটির অবদান ...


1
ভাল, একটি জটিল সমস্যার সাথে মোকাবিলা করার অর্থ এই নয় যে সমাধানটি মার্জিত হতে পারে। আবার, আমি সমস্যাটিও বুঝতে পারি, তবে পুরো স্ট্রিং ক্লাস এবং এর সাথে ডিল করা কেবল ভয়ঙ্কর।
নিখরচায়

5

হতাশা একই, এটা যে হার্ড করা উচিত নয় ...

আমি বৃহত্তর পাঠ্য থেকে সাবস্ট্রিংয়ের জন্য অবস্থান পাওয়ার এই উদাহরণটি সংকলন করেছি:

//
// Play with finding substrings returning an array of the non-unique words and positions in text
//
//

import UIKit

let Bigstring = "Why is it so hard to find substrings in Swift3"
let searchStrs : Array<String>? = ["Why", "substrings", "Swift3"]

FindSubString(inputStr: Bigstring, subStrings: searchStrs)


func FindSubString(inputStr : String, subStrings: Array<String>?) ->    Array<(String, Int, Int)> {
    var resultArray : Array<(String, Int, Int)> = []
    for i: Int in 0...(subStrings?.count)!-1 {
        if inputStr.contains((subStrings?[i])!) {
            let range: Range<String.Index> = inputStr.range(of: subStrings![i])!
            let lPos = inputStr.distance(from: inputStr.startIndex, to: range.lowerBound)
            let uPos = inputStr.distance(from: inputStr.startIndex, to: range.upperBound)
            let element = ((subStrings?[i])! as String, lPos, uPos)
            resultArray.append(element)
        }
    }
    for words in resultArray {
        print(words)
    }
    return resultArray
}

রিটার্ন ("কেন", 0, 3) ("সাবস্ট্রিংস", 26, 36) ("সুইফট 3", 40, 46)


3
এটি কিছু কোড, তবে কীভাবে স্ট্রিং ইনডেক্সিং এবং সাবস্ট্রিংগুলি সুইফট 3-এ কাজ করে তা সত্যিই ব্যাখ্যা করে না।
রবার্ট

5

আমি সুইফ্ট 3-এ নতুন, তবে Stringউপমাটির (সূচীকরণ) বাক্য গঠনটি দেখে আমি মনে করি যে সূচকটি স্ট্রিংয়ের প্রতিবন্ধী "পয়েন্টার" এর মতো এবং ইন্ট একটি স্বাধীন অবজেক্ট হিসাবে সহায়তা করতে পারে। বেস + অফসেট সিনট্যাক্স ব্যবহার করে, তারপরে আমরা কোড বেলো দিয়ে স্ট্রিং থেকে আই-থ্র অক্ষরটি পেতে পারি:

let s = "abcdefghi"
let i = 2
print (s[s.index(s.startIndex, offsetBy:i)])
// print c

স্ট্রিং (পরিসীমা) সিনট্যাক্স ব্যবহার করে স্ট্রিং থেকে অক্ষরের (সূচীকরণের) জন্য আমরা কোড বেলো সহ আই-থ্রি থেকে এফ-ত্রি অক্ষর পেতে পারি:

let f = 6
print (s[s.index(s.startIndex, offsetBy:i )..<s.index(s.startIndex, offsetBy:f+1 )])
//print cdefg

স্ট্রিং.স্যাবস্ট্রিং (রেঞ্জ) ব্যবহার করে স্ট্রিং থেকে একটি স্ট্রিং (পরিসর) জন্য আমরা কোড বেলো ব্যবহার করে স্ট্রিংটি পেতে পারি:

print (s.substring (with:s.index(s.startIndex, offsetBy:i )..<s.index(s.startIndex, offsetBy:f+1 ) ) )
//print cdefg

মন্তব্য:

  1. I-th এবং f-th 0 দিয়ে শুরু হয়।

  2. চ-থে, আমি অফসেটবিওয়াই: এফ + 1 ব্যবহার করি কারণ সাবস্ক্রিপশন ব্যাপ্তির ব্যাপ্তি .. <(অর্ধ-খোলা অপারেটর), এফ-থ অবস্থান অন্তর্ভুক্ত করে না।

  3. অবশ্যই অবৈধ সূচকের মতো বৈধতাযুক্ত ত্রুটি অন্তর্ভুক্ত করতে হবে।


5

সুইফট 4+

extension String {
    func take(_ n: Int) -> String {
        guard n >= 0 else {
            fatalError("n should never negative")
        }
        let index = self.index(self.startIndex, offsetBy: min(n, self.count))
        return String(self[..<index])
    }
}

প্রথম এন অক্ষরের একটি অনুচ্ছেদ বা স্ট্রিংটি সংক্ষিপ্ত হলে পুরো স্ট্রিংটি প্রদান করে। (অনুপ্রাণিত: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/take.html )

উদাহরণ:

let text = "Hello, World!"
let substring = text.take(5) //Hello

4

আমি বেশ যান্ত্রিক চিন্তাভাবনা করছি। এখানে বেসিক ...

সুইফট 4 সুইফট 5

  let t = "abracadabra"

  let start1 = t.index(t.startIndex, offsetBy:0)
  let   end1 = t.index(t.endIndex, offsetBy:-5)
  let start2 = t.index(t.endIndex, offsetBy:-5)
  let   end2 = t.index(t.endIndex, offsetBy:0)

  let t2 = t[start1 ..< end1]
  let t3 = t[start2 ..< end2]                

  //or a shorter form 

  let t4 = t[..<end1]
  let t5 = t[start2...]

  print("\(t2) \(t3) \(t)")
  print("\(t4) \(t5) \(t)")

  // result:
  // abraca dabra abracadabra

ফলাফলটি একটি স্ট্রস্ট্রিং, মানে এটি মূল স্ট্রিংয়ের একটি অংশ। একটি সম্পূর্ণ বিকশিত পৃথক স্ট্রিং পেতে কেবল উদাহরণ ব্যবহার করুন

    String(t3)
    String(t4)

এটি আমি ব্যবহার করি:

    let mid = t.index(t.endIndex, offsetBy:-5)
    let firstHalf = t[..<mid]
    let secondHalf = t[mid...]

3

সুইফট 4

extension String {
    subscript(_ i: Int) -> String {
        let idx1 = index(startIndex, offsetBy: i)
        let idx2 = index(idx1, offsetBy: 1)
        return String(self[idx1..<idx2])
    }
}

let s = "hello"

s[0]    // h
s[1]    // e
s[2]    // l
s[3]    // l
s[4]    // o

2

আমি এর জন্য একটি সাধারণ এক্সটেনশন তৈরি করেছি (সুইফট 3)

extension String {
    func substring(location: Int, length: Int) -> String? {
        guard characters.count >= location + length else { return nil }
        let start = index(startIndex, offsetBy: location)
        let end = index(startIndex, offsetBy: location + length)
        return substring(with: start..<end)
    }
}

2

আরও একটি জেনেরিক বাস্তবায়ন:

এই কৌশলটি এখনও indexসুইফ্টের মানগুলি ধরে রাখতে ব্যবহার করে এবং একটি সম্পূর্ণ অক্ষর বোঝায়।

extension String
{
    func subString <R> (_ range: R) -> String? where R : RangeExpression, String.Index == R.Bound
    {
        return String(self[range])
    }

    func index(at: Int) -> Index
    {
        return self.index(self.startIndex, offsetBy: at)
    }
}

তৃতীয় অক্ষর থেকে সাব স্ট্রিং করতে:

let item = "Fred looks funny"
item.subString(item.index(at: 2)...) // "ed looks funny"

আমি উট ব্যবহার করেছি subStringএটা একটা ফেরৎ ইঙ্গিত Stringএবং না একটি Substring


2

উপরের ভিত্তিতে আমাকে নন-প্রিন্টিং অক্ষরটি মুদ্রণ-বিহীন অক্ষর থেকে বাদ দিয়ে একটি স্ট্রিং বিভক্ত করা দরকার। আমি দুটি পদ্ধতি বিকাশ করেছি:

var str = "abc\u{1A}12345sdf"
let range1: Range<String.Index> = str.range(of: "\u{1A}")!
let index1: Int = str.distance(from: str.startIndex, to: range1.lowerBound)
let start = str.index(str.startIndex, offsetBy: index1)
let end = str.index(str.endIndex, offsetBy: -0)
let result = str[start..<end] // The result is of type Substring
let firstStr = str[str.startIndex..<range1.lowerBound]

যা আমি উপরের উত্তরগুলি ব্যবহার করে একসাথে রেখেছি।

কারণ স্ট্রিং একটি সংগ্রহ যা আমি তারপরে নিম্নলিখিতটি করতাম:

var fString = String()
for (n,c) in str.enumerated(){

*if c == "\u{1A}" {
    print(fString);
    let lString = str.dropFirst(n + 1)
    print(lString)
    break
   }
 fString += String(c)
}*

যা আমার পক্ষে বেশি স্বজ্ঞাত ছিল। কোনটি সেরা? তারা বলার উপায় নেই যে তারা দুজনেই সুইফট 5-এ কাজ করে


আপনার উত্তরের জন্য ধন্যবাদ. সুইফট 5-এ স্ট্রিংসের বিষয়ে কিছু আলাদা? এটি নিয়ে এখনও খেলা করার মতো সময় আমার হাতে নেই।
সুরগাচ

তারা তাই বলে কিন্তু আমি এটি দেখার সুযোগ পাইনি।
জেরেমি অ্যান্ড্রুজ

1

সুইফট 4

"সাবস্ট্রিং" ( https://developer.apple.com/docamentation/swift/substring ):

let greeting = "Hi there! It's nice to meet you! 👋"
let endOfSentence = greeting.index(of: "!")!
let firstSentence = greeting[...endOfSentence]
// firstSentence == "Hi there!"

স্ট্রিংয়ের উদাহরণ:

private typealias HowDoYouLikeThatElonMusk = String
private extension HowDoYouLikeThatElonMusk {

    subscript(_ from: Character?, _ to: Character?, _ include: Bool) -> String? {
        if let _from: Character = from, let _to: Character = to {
            let dynamicSourceForEnd: String = (_from == _to ? String(self.reversed()) : self)
            guard let startOfSentence: String.Index = self.index(of: _from),
                let endOfSentence: String.Index = dynamicSourceForEnd.index(of: _to) else {
                return nil
            }

            let result: String = String(self[startOfSentence...endOfSentence])
            if include == false {
                guard result.count > 2 else {
                        return nil
                }
                return String(result[result.index(result.startIndex, offsetBy: 1)..<result.index(result.endIndex, offsetBy: -1)])
            }
            return result
        } else if let _from: Character = from {
            guard let startOfSentence: String.Index = self.index(of: _from) else {
                return nil
            }
            let result: String = String(self[startOfSentence...])
            if include == false {
                guard result.count > 1 else {
                    return nil
                }
                return String(result[result.index(result.startIndex, offsetBy: 1)...])
            }
            return result
        } else if let _to: Character = to {
            guard let endOfSentence: String.Index = self.index(of: _to) else {
                    return nil
            }
            let result: String = String(self[...endOfSentence])
            if include == false {
                guard result.count > 1 else {
                    return nil
                }
                return String(result[..<result.index(result.endIndex, offsetBy: -1)])
            }
            return result
        }
        return nil
    }
}

স্ট্রিং স্ট্রিং ব্যবহারের উদাহরণ:

let source =                                   ">>>01234..56789<<<"
// include = true
var from =          source["3", nil, true]  //       "34..56789<<<"
var to =            source[nil, "6", true]  // ">>>01234..56"
var fromTo =        source["3", "6", true]  //       "34..56"
let notFound =      source["a", nil, true]  // nil
// include = false
from =              source["3", nil, false] //        "4..56789<<<"
to =                source[nil, "6", false] // ">>>01234..5"
fromTo =            source["3", "6", false] //        "4..5"
let outOfBounds =   source[".", ".", false] // nil

let str = "Hello, playground"
let hello = str[nil, ",", false] // "Hello"

-1

সুইফ্ট 5
let desiredIndex: Int = 7 let substring = str[String.Index(encodedOffset: desiredIndex)...]
এই স্ট্রিং ভেরিয়েবল আপনাকে ফলাফল দেবে।
কেবলমাত্র এখানেই ইনটকে সূচীতে রূপান্তর করা হয় এবং তারপরে আপনি স্ট্রিংগুলিকে বিভক্ত করতে পারেন। আপনি ত্রুটি পাবেন না হলে।


2
এটা ভুল. একটি অক্ষরে এক বা একাধিক বাইট থাকতে পারে। এটি কেবল আসকি পাঠ্য সহ কাজ করে।
লিও ডাবাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.