এটি কীভাবে Stringসুইফটে টাইপটি কাজ করে এবং কীভাবে contains(_:)পদ্ধতিটি কাজ করে তার সাথে এটি করতে হবে ।
'👩👩👧👦' যা ইমোজি সিকোয়েন্স হিসাবে পরিচিত, যা স্ট্রিংয়ের মধ্যে একটি দৃশ্যমান চরিত্র হিসাবে রেন্ডার করা হয়। ক্রমটি Characterবস্তুগুলি নিয়ে গঠিত এবং একই সাথে এটি UnicodeScalarবস্তুগুলি নিয়ে গঠিত ।
আপনি যদি স্ট্রিংয়ের চরিত্রের গণনাটি পরীক্ষা করেন, আপনি দেখতে পাবেন এটি চারটি অক্ষর দ্বারা গঠিত, আপনি যদি ইউনিকোড স্কেলারের গণনা পরীক্ষা করেন, এটি আপনাকে আলাদা ফলাফল দেখাবে:
print("👩👩👧👦".characters.count) // 4
print("👩👩👧👦".unicodeScalars.count) // 7
এখন, আপনি যদি অক্ষরগুলি বিশ্লেষণ করে মুদ্রণ করেন তবে দেখতে পাবেন যে সাধারণ অক্ষরগুলির মতো লাগে তবে তিনটি প্রথম অক্ষরে ইমোজি পাশাপাশি একটি শূন্য প্রস্থের জোয়ার উভয়ই থাকে UnicodeScalarView :
for char in "👩👩👧👦".characters {
print(char)
let scalars = String(char).unicodeScalars.map({ String($0.value, radix: 16) })
print(scalars)
}
// 👩
// ["1f469", "200d"]
// 👩
// ["1f469", "200d"]
// 👧
// ["1f467", "200d"]
// 👦
// ["1f466"]
যেমন আপনি দেখতে পাচ্ছেন, কেবলমাত্র শেষ চরিত্রটিতে শূন্য প্রস্থের সংযুক্তকারী নেই, সুতরাং contains(_:)পদ্ধতিটি ব্যবহার করার সময় এটি আপনি যেমন প্রত্যাশা করতেন তেমন কাজ করে। যেহেতু আপনি শূন্য-প্রস্থের সংযোগকারী ইমোজিগুলির সাথে তুলনা করছেন না, পদ্ধতিটি শেষ চরিত্রটি ছাড়া আর কোনওটির জন্য কোনও মিল খুঁজে পাবে না।
এটি প্রসারিত করার জন্য, আপনি যদি Stringকোনও ইমোজি চরিত্রের সমন্বয়ে একটি শূন্য প্রস্থের সংযুক্তকারী দ্বারা তৈরি হয়ে থাকে এবং এটি contains(_:)পদ্ধতিতে পাস করেন তবে এটির মূল্যায়নও হবে false। এই কি আছে contains(_:)যেমন সঠিক একই হচ্ছে range(of:) != nil, যা প্রদত্ত যুক্তি একটি সঠিক মিল খোঁজ করে। যেহেতু শূন্য-প্রস্থের সংযুক্তকারীর সাথে শেষ হওয়া অক্ষরগুলি একটি অসম্পূর্ণ অনুক্রম তৈরি করে, শূন্য-প্রস্থের সংযুক্তকারীগুলির সাথে সমাপ্ত অক্ষরগুলিকে সম্পূর্ণ অনুক্রমের সাথে সংমিশ্রিত করার সময় পদ্ধতিটি আর্গুমেন্টের জন্য একটি মিল খুঁজে পাওয়ার চেষ্টা করে। এর অর্থ হল যে পদ্ধতিটি কোনও মিল খুঁজে পাবে না যদি:
- যুক্তিটি একটি শূন্য প্রস্থের সংযুক্তকারীর সাথে শেষ হয় এবং
- পার্স করার স্ট্রিংটিতে একটি অসম্পূর্ণ অনুক্রম নেই (অর্থাত্ শূন্য প্রস্থের সংযুক্তকারীর সাথে শেষ হওয়া এবং কোনও সামঞ্জস্যপূর্ণ অক্ষর অনুসরণ করা হবে না)।
প্রদর্শন করার জন্যে:
let s = "\u{1f469}\u{200d}\u{1f469}\u{200d}\u{1f467}\u{200d}\u{1f466}" // 👩👩👧👦
s.range(of: "\u{1f469}\u{200d}") != nil // false
s.range(of: "\u{1f469}\u{200d}\u{1f469}") != nil // false
তবে তুলনাটি কেবলমাত্র সামনে দেখায়, আপনি পেছনের দিকে কাজ করে স্ট্রিংয়ের মধ্যে আরও কয়েকটি সম্পূর্ণ ক্রম সন্ধান করতে পারেন:
s.range(of: "\u{1f466}") != nil // true
s.range(of: "\u{1f467}\u{200d}\u{1f466}") != nil // true
s.range(of: "\u{1f469}\u{200d}\u{1f467}\u{200d}\u{1f466}") != nil // true
// Same as the above:
s.contains("\u{1f469}\u{200d}\u{1f467}\u{200d}\u{1f466}") // true
সবচেয়ে সহজ সমাধান range(of:options:range:locale:)পদ্ধতিটিতে একটি নির্দিষ্ট তুলনা বিকল্প সরবরাহ করা হবে । বিকল্পটি হুবহু অক্ষর দ্বারা বর্ণের সমতুল্যেরString.CompareOptions.literal তুলনা সম্পাদন করে । পার্শ্ব নোট হিসাবে, এখানে অক্ষর বলতে যা বোঝায় তা সুইফট নয় , তবে ইউটিএফ -16 উভয়ই উদাহরণ এবং তুলনা স্ট্রিংয়ের উপস্থাপনা - তবে যেহেতু ত্রুটিযুক্ত ইউটিএফ -১ 16 অনুমতি দেয় না, এটি মূলত ইউনিকোড স্কেলারের সাথে তুলনা করার সমতুল্য উপস্থাপনা।CharacterString
এখানে আমি Foundationপদ্ধতিটি ওভারলোড করেছি , সুতরাং আপনার যদি আসলটির প্রয়োজন হয় তবে এই নাম বা কোনওটির নতুন নাম দিন:
extension String {
func contains(_ string: String) -> Bool {
return self.range(of: string, options: String.CompareOptions.literal) != nil
}
}
এখন পদ্ধতিটি প্রতিটি চরিত্রের সাথে "অসম্পূর্ণ" হিসাবে কাজ করে এমনকি অসম্পূর্ণ অনুক্রম সহ:
s.contains("👩") // true
s.contains("👩\u{200d}") // true
s.contains("\u{200d}") // true