ios - Swift একটি অ্যারে একটি স্ট্রিং বিভক্ত?
string split (20)
বলুন আমি এখানে একটি স্ট্রিং আছে:
var fullName: String = "First Last"
আমি হোয়াইট স্পেসে স্ট্রিং বেসটি বিভাজন করতে এবং তাদের সম্পর্কিত ভেরিয়েবলগুলিতে মান নির্ধারণ করতে চাই
var fullNameArr = // something like: fullName.explode(" ")
var firstName: String = fullNameArr[0]
var lastName: String? = fullnameArr[1]
এছাড়াও, কখনও কখনও ব্যবহারকারীদের একটি শেষ নাম থাকতে পারে না।
হোয়াইটস্পেস সমস্যা
সাধারণত, মানুষ এই সমস্যা এবং খারাপ সমাধান ওভার reinvent। এই একটি স্থান? "এবং" \ n "," \ t "বা কিছু ইউনিকোড হোয়াইট স্পেস চরিত্র যা আপনি কখনও দেখেনি, এটি কোনও অংশে অদৃশ্য নয়। আপনি দূরে পেতে পারেন যখন
একটি দুর্বল সমাধান
import Foundation
let pieces = "Mary had little lamb".componentsSeparatedByString(" ")
আপনি যদি কখনও স্ট্রিঙ্গস বা তারিখের উপর একটি WWDC ভিডিও দেখতে বাস্তবতা আপনার দৃঢ়ভাবে ঝাঁকনি প্রয়োজন। সংক্ষেপে, অ্যাপলকে এই ধরণের মুণ্ডনে কাজটি সমাধান করার অনুমতি দেওয়া প্রায় সবসময় ভাল।
শক্তসমর্থ সমাধান: NSCharacterSet ব্যবহার করুন
এটি সঠিকভাবে করার উপায়, NSCharacterSet
, NSCharacterSet
ব্যবহার করা যেহেতু আগে বলেছে যে আপনার হোয়াইটস্পেসটি আপনি কী আশা করেন না এবং অ্যাপলটি হোয়াইটস্পেস ক্যারেক্টার সেট সরবরাহ করেছে। বিভিন্ন প্রদত্ত চরিত্র সেটগুলি অন্বেষণ করতে অ্যাপল এর এনএসএইচহারেচারেটেট ডেভেলপার ডকুমেন্টেশনটি পরীক্ষা করে দেখুন এবং তারপরে কেবল তখনই, আপনার চরিত্রটি পূরণ না করে একটি নতুন চরিত্র সেট তৈরি বা গঠন করুন।
NSCharacterSet হোয়াইটস্পেস
ইউনিকোড জেনারেল বিভাগ জেড এবং চার্জার টেবিলেশন (U + 0009) এর অক্ষর ধারণকারী অক্ষর সেটটি প্রদান করে।
let longerString: String = "This is a test of the character set splitting system"
let components = longerString.components(separatedBy: .whitespaces)
print(components)
WMios এর উত্তরের বিকল্প হিসাবে, আপনি componentsSeparatedByCharactersInSet
ব্যবহার করতে পারেন SperaratedBycharactersInSet, যা আপনার ক্ষেত্রে আরও বিভাজক (ফাঁকা স্থান, কমা, ইত্যাদি) ব্যবহার করতে পারে।
আপনার নির্দিষ্ট ইনপুট সঙ্গে:
let separators = NSCharacterSet(charactersInString: " ")
var fullName: String = "First Last";
var words = fullName.componentsSeparatedByCharactersInSet(separators)
// words contains ["First", "Last"]
একাধিক বিভাজক ব্যবহার করে:
let separators = NSCharacterSet(charactersInString: " ,")
var fullName: String = "Last, First Middle";
var words = fullName.componentsSeparatedByCharactersInSet(separators)
// words contains ["Last", "First", "Middle"]
আমি পিচ্ছিলকারক বিভক্তির জন্য খুঁজছিলাম , যেমন পিএইচপি এর explode
যেখানে ফাঁকা ক্রমগুলি অ্যারের মধ্যে অন্তর্ভুক্ত করা হয়েছে, এটি আমার জন্য কাজ করেছে:
"First ".split(separator: " ", maxSplits: 1, omittingEmptySubsequences: false)
আউটপুট:
["First", ""]
আমি একটি আকর্ষণীয় ক্ষেত্রে পাওয়া যায়, যে
পদ্ধতি 1
var data:[String] = split( featureData ) { $0 == "\u{003B}" }
যখন সার্ভার থেকে লোড হওয়া ডেটা থেকে কিছু প্রতীককে বিভক্ত করার জন্য আমি এই কমান্ডটি ব্যবহার করি, তখন এটি সিমুলেটর টেস্টে বিভক্ত এবং পরীক্ষা ডিভাইসের সাথে সিঙ্ক করা যায় তবে এটি প্রকাশ অ্যাপে এবং বিভাজনে বিভক্ত হবে না।
এই ত্রুটিটি ট্র্যাক করতে আমাকে অনেক সময় লাগছে, এটি কিছু সুইফ্ট সংস্করণ, বা কিছু iOS সংস্করণ থেকে শাপিত হতে পারে
এটি এইচটিএমএল কোড সম্পর্কেও নয়, যেহেতু আমি স্ট্রাইমিং টাইমিংপ্রেনসেট এনকোডিং স্ট্রিং করার চেষ্টা করি এবং এটি এখনও কাজ করে না
সংযোজন 10/10/2015
সুইফ্ট 2.0 এ এই পদ্ধতিটি পরিবর্তন করা হয়েছে
var data:[String] = featureData.split {$0 == "\u{003B}"}
পদ্ধতি 2
var data:[String] = featureData.componentsSeparatedByString("\u{003B}")
যখন আমি এই কমান্ডটি ব্যবহার করি, এটি একই ডেটা বিভক্ত করতে পারে যা সার্ভার থেকে সঠিকভাবে লোড হয়
উপসংহার, আমি সত্যিই পদ্ধতি 2 ব্যবহার করার পরামর্শ
string.componentsSeparatedByString("")
আমি এমন সমাধান পাইনি যা 3 বা ততোধিক উপাদানগুলির সাথে নামগুলি পরিচালনা করবে এবং পুরানো iOS সংস্করণগুলি সমর্থন করবে।
struct NameComponentsSplitter {
static func split(fullName: String) -> (String?, String?) {
guard !fullName.isEmpty else {
return (nil, nil)
}
let components = fullName.components(separatedBy: .whitespacesAndNewlines)
let lastName = components.last
let firstName = components.dropLast().joined(separator: " ")
return (firstName.isEmpty ? nil : firstName, lastName)
}
}
পাস পরীক্ষার ক্ষেত্রে:
func testThatItHandlesTwoComponents() {
let (firstName, lastName) = NameComponentsSplitter.split(fullName: "John Smith")
XCTAssertEqual(firstName, "John")
XCTAssertEqual(lastName, "Smith")
}
func testThatItHandlesMoreThanTwoComponents() {
var (firstName, lastName) = NameComponentsSplitter.split(fullName: "John Clark Smith")
XCTAssertEqual(firstName, "John Clark")
XCTAssertEqual(lastName, "Smith")
(firstName, lastName) = NameComponentsSplitter.split(fullName: "John Clark Jr. Smith")
XCTAssertEqual(firstName, "John Clark Jr.")
XCTAssertEqual(lastName, "Smith")
}
func testThatItHandlesEmptyInput() {
let (firstName, lastName) = NameComponentsSplitter.split(fullName: "")
XCTAssertEqual(firstName, nil)
XCTAssertEqual(lastName, nil)
}
এই আবার বিটা মধ্যে পরিবর্তিত হয়েছে 5. ওয়েই! এটি এখন কালেকশন টাইপের একটি পদ্ধতি
পুরানো:
var fullName = "First Last"
var fullNameArr = split(fullName) {$0 == " "}
নতুন:
var fullName = "First Last"
var fullNameArr = fullName.split {$0 == " "}
এই সহায়ক হয় আশা করি
সুইফ্ট 4: একটি অ্যারের মধ্যে একটি স্ট্রিং বিভক্ত। ধাপ 1: স্ট্রিং বরাদ্দ। পদক্ষেপ 2: @ বিভক্ত উপর ভিত্তি করে। নোট: variableName.components (বিচ্ছিন্ন করে: "বিভক্ত শব্দ")
let fullName: String = "First Last @ triggerd event of the session by session storage @ it can be divided by the event of the trigger."
let fullNameArr = fullName.components(separatedBy: "@")
print("split", fullNameArr)
এখানে একটি অ্যালগরিদম যা আমি তৈরি করেছি, যা অ্যারের থেকে কোনও Character
দ্বারা একটি String
বিভক্ত করবে এবং যদি বিভক্ত অক্ষরগুলির সাথে সাবস্ট্রিংগুলি রাখতে কোনও ইচ্ছা থাকে তবে এটি গ্যালো প্যারামিটারটিকে true
সেট করতে পারে।
এক্সকোড 7.3 - সুইফট 2.2:
extension String {
func splitBy(characters: [Character], swallow: Bool = false) -> [String] {
var substring = ""
var array = [String]()
var index = 0
for character in self.characters {
if let lastCharacter = substring.characters.last {
// swallow same characters
if lastCharacter == character {
substring.append(character)
} else {
var shouldSplit = false
// check if we need to split already
for splitCharacter in characters {
// slit if the last character is from split characters or the current one
if character == splitCharacter || lastCharacter == splitCharacter {
shouldSplit = true
break
}
}
if shouldSplit {
array.append(substring)
substring = String(character)
} else /* swallow characters that do not equal any of the split characters */ {
substring.append(character)
}
}
} else /* should be the first iteration */ {
substring.append(character)
}
index += 1
// add last substring to the array
if index == self.characters.count {
array.append(substring)
}
}
return array.filter {
if swallow {
return true
} else {
for splitCharacter in characters {
if $0.characters.contains(splitCharacter) {
return false
}
}
return true
}
}
}
}
উদাহরণ:
"test text".splitBy([" "]) // ["test", "text"]
"test++text--".splitBy(["+", "-"], swallow: true) // ["test", "++" "text", "--"]
ধরুন আপনার "হ্যালো ওয়ার্ল্ড" নামে একটি পরিবর্তনশীল আছে এবং যদি আপনি এটি বিভক্ত করতে চান এবং এটি দুটি পৃথক ভেরিয়েবলগুলিতে সংরক্ষণ করতে চান তবে আপনি এটি ব্যবহার করতে পারেন:
var fullText = "Hello World"
let firstWord = fullText.text?.components(separatedBy: " ").first
let lastWord = fullText.text?.components(separatedBy: " ").last
শুধু আপনার fullName
উপর componentsSeparatedByString
পদ্ধতি কল
import Foundation
var fullName: String = "First Last"
let fullNameArr = fullName.componentsSeparatedByString(" ")
var firstName: String = fullNameArr[0]
var lastName: String = fullNameArr[1]
সুইফ্ট 3+ জন্য আপডেট করুন
import Foundation
let fullName = "First Last"
let fullNameArr = fullName.components(separatedBy: " ")
let name = fullNameArr[0]
let surname = fullNameArr[1]
সুইফ্ট উপায় গ্লোবাল split
ফাংশন ব্যবহার করা হয়, যেমন:
var fullName = "First Last"
var fullNameArr = split(fullName) {$0 == " "}
var firstName: String = fullNameArr[0]
var lastName: String? = fullNameArr.count > 1 ? fullNameArr[1] : nil
সুইফ্ট সঙ্গে 2
সুইফ্ট 2-এ অভ্যন্তরীণ ক্যারেক্টার ভিউ প্রকারের প্রবর্তনের কারণে বিভক্ত ব্যবহারটি আরও জটিল হয়ে ওঠে। এর মানে স্ট্রিং আর .characters
টাইপ বা কালেকশন টাইপ প্রোটোকল গ্রহণ করে না এবং আপনাকে অবশ্যই স্ট্রিং ইনস্ট্যান্সের অক্ষর .characters
টাইপ উপস্থাপনা অ্যাক্সেস করার জন্য .characters
সম্পত্তিটি ব্যবহার করতে হবে। (দ্রষ্টব্য: ক্যারেক্টার ভিউ সিকেন্স টাইপ এবং কালেকশন টাইপ প্রোটোকলগুলি গ্রহণ করে)।
let fullName = "First Last"
let fullNameArr = fullName.characters.split{$0 == " "}.map(String.init)
// or simply:
// let fullNameArr = fullName.characters.split{" "}.map(String.init)
fullNameArr[0] // First
fullNameArr[1] // Last
স্ট্রিট হ্যান্ডলিংটি এখনও সুইফ্টে একটি চ্যালেঞ্জ এবং এটি উল্লেখযোগ্যভাবে পরিবর্তিত থাকে, যেমন আপনি অন্য উত্তরের থেকে দেখতে পারেন। আশা করি জিনিসগুলি স্থায়ীভাবে বসবে এবং এটি সহজ হয়ে যাবে। একাধিক বিভাজক অক্ষর সহ সুইফ্টের বর্তমান 3.0 সংস্করণের সাথে এটি করার উপায়।
সুইফ্ট 3:
let chars = CharacterSet(charactersIn: ".,; -")
let split = phrase.components(separatedBy: chars)
// Or if the enums do what you want, these are preferred.
let chars2 = CharacterSet.alphaNumerics // .whitespaces, .punctuation, .capitalizedLetters etc
let split2 = phrase.components(separatedBy: chars2)
এক্সকোড 8.0 / সুইফ্ট 3
let fullName = "First Last"
var fullNameArr = fullName.components(separatedBy: " ")
var firstname = fullNameArr[0] // First
var lastname = fullNameArr[1] // Last
দীর্ঘ পথ:
var fullName: String = "First Last"
fullName += " " // this will help to see the last word
var newElement = "" //Empty String
var fullNameArr = [String]() //Empty Array
for Character in fullName.characters {
if Character == " " {
fullNameArr.append(newElement)
newElement = ""
} else {
newElement += "\(Character)"
}
}
var firsName = fullNameArr[0] // First
var lastName = fullNameArr[1] // Last
এক্সকোড 9 সুইফ্ট 4 বা এক্সকোড 8.2.1 • সুইফ্ট 3.0.2
আপনি যদি শুধুমাত্র একজন ব্যক্তির নাম সঠিকভাবে ফরম্যাট করতে চান তবে আপনি PersonNameComponentsFormatter ব্যবহার করতে পারেন।
PersonNameComponentsFormatter ক্লাস একটি ব্যক্তির নামগুলির উপাদানগুলির স্থানীয়করণ উপস্থাপনা সরবরাহ করে, যেমন একটি PersonNameComponents বস্তু দ্বারা প্রতিনিধিত্ব করা হয়। ব্যবহারকারীর নাম ব্যবহারকারীর তথ্য প্রদর্শন করার সময় স্থানীয়করণের নামগুলি তৈরি করতে এই ক্লাসটি ব্যবহার করুন।
// iOS (9.0 and later), macOS (10.11 and later), tvOS (9.0 and later), watchOS (2.0 and later)
let nameFormatter = PersonNameComponentsFormatter()
let name = "Mr. Steven Paul Jobs Jr."
// personNameComponents requires iOS (10.0 and later)
if let nameComps = nameFormatter.personNameComponents(from: name) {
nameComps.namePrefix // Mr.
nameComps.givenName // Steven
nameComps.middleName // Paul
nameComps.familyName // Jobs
nameComps.nameSuffix // Jr.
// It can also be configured to format your names
// Default (same as medium), short, long or abbreviated
nameFormatter.style = .default
nameFormatter.string(from: nameComps) // "Steven Jobs"
nameFormatter.style = .short
nameFormatter.string(from: nameComps) // "Steven"
nameFormatter.style = .long
nameFormatter.string(from: nameComps) // "Mr. Steven Paul Jobs jr."
nameFormatter.style = .abbreviated
nameFormatter.string(from: nameComps) // SJ
// It can also be use to return an attributed string using annotatedString method
nameFormatter.style = .long
nameFormatter.annotatedString(from: nameComps) // "Mr. Steven Paul Jobs jr."
}
সুইফ্ট 3
let line = "AAA BBB\t CCC"
let fields = line.components(separatedBy: .whitespaces).filter {!$0.isEmpty}
- তিন স্ট্রিং
AAA
,BBB
এবংCCC
- খালি ক্ষেত্র ফিল্টার
- একাধিক স্পেস এবং tabulation অক্ষর পরিচালনা করে
- আপনি নতুন লাইন পরিচালনা করতে চান, তাহলে।
.whitespaces
এবং.whitespacesAndNewlines
সহ।.whitespacesAndNewlines
প্রতিস্থাপন করুন
সুইফ্ট 4, এক্সকোড 10 এবং iOS 12 আপডেট 100% কাজ
let fullName = "First Last"
let fullNameArr = fullName.components(separatedBy: " ")
let firstName = fullNameArr[0] //First
let lastName = fullnameArr[1] //Last
আরও তথ্যের জন্য এখানে অ্যাপল এর ডকুমেন্টেশন দেখুন।
সুইফ্ট 4
let string = "loremipsum.dolorsant.amet:"
let result = string.components(separatedBy: ".")
print(result[0])
print(result[1])
print(result[2])
print("total: \(result.count)")
আউটপুট
loremipsum
dolorsant
amet:
total: 3
সুইফ্ট 4
let words = "these words will be elements in an array".components(separatedBy: " ")
সুইফ্ট দেব। 4.0 (মে 24, 2017)
সুইফ্ট 4 ( বিটা ) -এ একটি নতুন ফাংশন split
।
import Foundation
let sayHello = "Hello Swift 4 2017";
let result = sayHello.split(separator: " ")
print(result)
আউটপুট:
["Hello", "Swift", "4", "2017"]
মানগুলি অ্যাক্সেস করা:
print(result[0]) // Hello
print(result[1]) // Swift
print(result[2]) // 4
print(result[3]) // 2017
এক্সকোড 8.1 / সুইফট 3.0.1
এখানে অ্যারের সঙ্গে একাধিক delimiters উপায়।
import Foundation
let mathString: String = "12-37*2/5"
let numbers = mathString.components(separatedBy: ["-", "*", "/"])
print(numbers)
আউটপুট:
["12", "37", "2", "5"]
let str = "one two"
let strSplit = str.characters.split(" ").map(String.init) // returns ["one", "two"]
এক্সকোড 7.2 (7C68)