সুইফ্টের স্ট্রিং থেকে প্রথম অক্ষরটি সরিয়ে ফেলার সর্বাধিক সংযোগ উপায় কী?


122

আমি একটি স্ট্রিং থেকে প্রথম অক্ষর মুছতে চাই। এখনও অবধি, আমি যে সবচেয়ে সফল জিনিসটি নিয়ে এসেছি তা হ'ল:

display.text = display.text!.substringFromIndex(advance(display.text!.startIndex, 1))

আমি জানি আমরা Intইউনিকোডের কারণে একটি স্ট্রিংয়ের সাথে সূচী করতে পারি না , তবে এই সমাধানটি ভয়াবহভাবে ভারবস বলে মনে হয়। অন্য উপায়ে কি আমি উপেক্ষা করছি?


3
আসলে আপনি এনএসএসস্ট্রিং এ advanceকাস্ট করে পুরো জিনিসটি এড়াতে পারবেন display.text!। আমি বলছি না এটি একটি ভাল সমাধান - কেবল একটি সম্ভাব্য ভুল ধারণাটি সংশোধন করে। এনএসএসস্ট্রিং এর সাহায্যে আপনি ইন্টের সাথে এটিতে সূচক করতে পারেন । - এবং আপনি যে কারণে ইন্টের সাথে সূচক করতে পারবেন না তা ইউনিকোডের কারণে নয়; এর কারণ একটি চরিত্রটিতে একাধিক যৌগিক কোডপয়েন্ট থাকতে পারে।
ম্যাট

আপনি যদি Stringএটির মূলধন করতে এই কাজটি করে থাকেন তবে তত্কালীন সুইফট 3 এ capitalizedফাংশনটি চালু করেছে String
ভিন্স ও'সুলিভান

উত্তর:


207

আপনি যদি সুইফট 3 ব্যবহার করেন তবে আপনি এই উত্তরের দ্বিতীয় বিভাগটি উপেক্ষা করতে পারেন। সুসংবাদটি হ'ল, এখন এটি আবার সংক্ষিপ্ত! কেবল স্ট্রিংয়ের নতুন অপসারণ (এ :) পদ্ধতিটি ব্যবহার করে।

var myString = "Hello, World"
myString.remove(at: myString.startIndex)

myString // "ello, World"

আমি এর dropFirst()জন্য গ্লোবাল ফাংশন পছন্দ করি ।

let original = "Hello" // Hello
let sliced = dropFirst(original) // ello

এটি সংক্ষিপ্ত, স্পষ্ট এবং স্লাইসেবল প্রোটোকলের সাথে সঙ্গতিপূর্ণ এমন কোনও কিছুর জন্য কাজ করে।

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

let original = "Hello" // Hello
let sliced = String(original.characters.dropFirst()) // ello

আরেকটি বিকল্প হ'ল স্ট্রিংয়ের স্প্লাইস করতে প্রত্যয় ফাংশনটি ব্যবহার করা UTF16View। অবশ্যই এটি পরে স্ট্রিংয়ে রূপান্তর করতে হবে।

let original = "Hello" // Hello
let sliced = String(suffix(original.utf16, original.utf16.count - 1)) // ello

এই সমস্ত বলতে গেলে আমি যে সমাধানটি মূলত সরবরাহ করেছি তা স্যুইফ্টের নতুন সংস্করণগুলিতে এটি করার সবচেয়ে সংক্ষিপ্ত উপায় নয়। removeAtIndex()আপনি যদি একটি স্বল্প এবং স্বজ্ঞাত সমাধানের সন্ধান করছেন তবে আমি @ ক্রিসের সমাধানটিতে ফিরে আসার পরামর্শ দিচ্ছি ।

var original = "Hello" // Hello
let removedChar = original.removeAtIndex(original.startIndex)

original // ello

এবং নীচের মন্তব্যে @ ভাকাওয়ামার নির্দেশ অনুসারে, আরেকটি বিকল্প যা মূল স্ট্রিংটি সংশোধন করে না তা হ'ল সাবস্ট্রিংফ্রোমআইন্ডেক্স ব্যবহার করা।

let original = "Hello" // Hello
let substring = original.substringFromIndex(advance(original.startIndex, 1)) // ello

অথবা আপনি যদি স্ট্রিংয়ের শুরু এবং শেষের দিকে কোনও চরিত্র ফেলে দেওয়ার চেষ্টা করছেন, আপনি সাবস্ট্রিংউথথ্রেঞ্জ ব্যবহার করতে পারেন। যখন শর্ত থেকে রক্ষা করতে ভুলবেন না startIndex + n > endIndex - m

let original = "Hello" // Hello

let newStartIndex = advance(original.startIndex, 1)
let newEndIndex = advance(original.endIndex, -1)

let substring = original.substringWithRange(newStartIndex..<newEndIndex) // ell

শেষ লাইনটি সাবস্ক্রিপ্ট নোটেশন ব্যবহার করেও লেখা যেতে পারে।

let substring = original[newStartIndex..<newEndIndex]

2
এবং এটি আপনার ফাউন্ডেশন বিশ্বে পা রাখার প্রয়োজন নেই।
11:38

2
এবং এটি খুব বেশি সুইফট / এফপি হয়।
ডেভিড বেরি

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

1
ড্রপলাস্ট বা ড্রপফার্স ব্যবহার করার সময় মনে রাখবেন, স্ট্রিংটি মোড়ক করুন অন্যথায় এটি কাজ করবে না।
ভাভুক জৈন

3
দুর্দান্ত উত্তর! আমি মনে করি এটি remove(at:)পদ্ধতির রিটার্ন মানটি মূল্যবান বলে মনে হচ্ছে : এটি অক্ষরটি মুছে ফেলা হয়েছে, নতুন স্ট্রিং নয়। উদাহরণস্বরূপ let removedCharacter = myString.remove(at: myString.startIndex),। আমি এই পদ্ধতির ক্ষেত্রে এই ঘটনাটি ভুলে গিয়ে পদ্ধতি কলের ফলাফলটি ফেরত দেওয়ার ভুল করেছিলাম। সব শুভ কোডিং!
kbpontius

118

সুইফট 4 এর জন্য আপডেট

সুইফ্ট 4-এ, আবারও Stringমানানসই Collection, সুতরাং ব্যবহার dropFirstএবং dropLastস্ট্রিংয়ের শুরু এবং শেষগুলি ছাঁটাই করা সম্ভব । ফলাফলটি প্রকারভেদে Substring, তাই কোনওটি Stringফিরে পেতে আপনার এটি নির্মাণকারীর কাছে পৌঁছে দিতে হবে String:

let str = "hello"
let result1 = String(str.dropFirst())    // "ello"
let result2 = String(str.dropLast())     // "hell"

dropFirst()এবং dropLast()এছাড়াও একটি নিতে Intড্রপ অক্ষরের সংখ্যা উল্লেখ করার:

let result3 = String(str.dropLast(3))    // "he"
let result4 = String(str.dropFirst(4))   // "o"

আপনি যদি স্ট্রিংয়ের চেয়ে বেশি অক্ষর বাদ দিতে নির্দিষ্ট করেন তবে ফলাফলটি খালি স্ট্রিং ( "") হবে।

let result5 = String(str.dropFirst(10))  // ""

সুইফট 3 এর জন্য আপডেট

আপনি যদি কেবলমাত্র প্রথম অক্ষরটি সরাতে এবং স্থানে মূল স্ট্রিংটি পরিবর্তন করতে চান তবে @ মিকম্যাককলামের উত্তর দেখুন। আপনি যদি প্রক্রিয়াটিতে একটি নতুন স্ট্রিং তৈরি করতে চান তবে ব্যবহার করুন substring(from:)। একটি এক্সটেনশন সঙ্গে String, আপনি কদর্যতা লুকিয়ে রাখতে পারেন substring(from:)এবং substring(to:)শুরু করুন এবং প্রান্ত ছাঁটা দরকারী সংযোজন তৈরি করতে String:

extension String {
    func chopPrefix(_ count: Int = 1) -> String {
        return substring(from: index(startIndex, offsetBy: count))
    }

    func chopSuffix(_ count: Int = 1) -> String {
        return substring(to: index(endIndex, offsetBy: -count))
    }
}

"hello".chopPrefix()    // "ello"
"hello".chopPrefix(3)   // "lo"

"hello".chopSuffix()    // "hell"
"hello".chopSuffix(3)   // "he"

তাদের মতো dropFirstএবং তার dropLastআগে, স্ট্রিংয়ে পর্যাপ্ত অক্ষর না থাকলে এই ফাংশনগুলি ক্রাশ হয়ে যাবে। এগুলি সঠিকভাবে ব্যবহার করার জন্য কলিংকারীদের উপর অনুনাস রয়েছে। এটি একটি বৈধ ডিজাইনের সিদ্ধান্ত। কেউ তাদের themচ্ছিক ফেরত দিতে তাদের লিখতে পারে যা কলারের দ্বারা আন-আপ করা উচিত।


সুইফট 2.x

হায়রে সুইফট 2 , dropFirstএবং dropLast(পূর্ববর্তী সবচেয়ে ভালো সমাধান) হিসেবে সুবিধাজনক হিসাবে তারা আগে ছিল না। একটি এক্সটেনশন সঙ্গে String, আপনি কদর্যতা লুকিয়ে রাখতে পারেন substringFromIndexএবং substringToIndex:

extension String {
    func chopPrefix(count: Int = 1) -> String {
         return self.substringFromIndex(advance(self.startIndex, count))
    }

    func chopSuffix(count: Int = 1) -> String {
        return self.substringToIndex(advance(self.endIndex, -count))
    }
}

"hello".chopPrefix()    // "ello"
"hello".chopPrefix(3)   // "lo"

"hello".chopSuffix()    // "hell"
"hello".chopSuffix(3)   // "he"

তাদের মতো dropFirstএবং তার dropLastআগে, স্ট্রিংয়ে পর্যাপ্ত অক্ষর না থাকলে এই ফাংশনগুলি ক্রাশ হয়ে যাবে। এগুলি সঠিকভাবে ব্যবহার করার জন্য কলিংকারীদের উপর অনুনাস রয়েছে। এটি একটি বৈধ ডিজাইনের সিদ্ধান্ত। কেউ তাদের themচ্ছিক ফেরত দিতে তাদের লিখতে পারে যা কলারের দ্বারা আন-আপ করা উচিত।


ইন সুইফট 1.2 , আপনাকে কল করতে হবে chopPrefixএভাবে:

"hello".chopPrefix(count: 3)  // "lo"

অথবা আপনি _প্যারামিটারের নামটি দমন করতে ফাংশন সংজ্ঞাগুলিতে একটি আন্ডারস্কোর যুক্ত করতে পারেন :

extension String {
    func chopPrefix(_ count: Int = 1) -> String {
         return self.substringFromIndex(advance(self.startIndex, count))
    }

    func chopSuffix(_ count: Int = 1) -> String {
        return self.substringToIndex(advance(self.endIndex, -count))
    }
}

3
সুইফটের অন্তর্নির্মিত স্ট্রিং ম্যানিপুলেশন কতটা জটিল তা নিয়ে আমি এখনও উড়ে এসেছি। আমি বোঝাতে চাইছি এটি মৌলিক, মৌলিক জিনিস; দেখে মনে হচ্ছে না যে আমি পার্সার প্রয়োগ করছি। এটি সহজ করার জন্য বর্ধনের জন্য ধন্যবাদ। এটি বিস্মিত হচ্ছে অ্যাপল কেবল স্ট্রিং ক্লাসে এটি যুক্ত করবে না! সম্ভবত এটি এখনও প্রচুর পরিমাণে প্রবাহিত।
ডিভাইস 1

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

17

সুইফট 2.2

'অগ্রিম' অনুপলব্ধ: সূচকে 'অ্যাডভান্সড বাই (এন)' পদ্ধতিটি কল করুন

    func chopPrefix(count: Int = 1) -> String {
        return self.substringFromIndex(self.startIndex.advancedBy(count))
    }

    func chopSuffix(count: Int = 1) -> String {
        return self.substringFromIndex(self.endIndex.advancedBy(count))
    }

সুইফট 3.0

    func chopPrefix(_ count: Int = 1) -> String {
        return self.substring(from: self.characters.index(self.startIndex, offsetBy: count))
    }

    func chopSuffix(_ count: Int = 1) -> String {
       return self.substring(to: self.characters.index(self.endIndex, offsetBy: -count))
    }

সুইফট ৩.২

অক্ষরের সংগ্রহ হিসাবে স্ট্রিংয়ের সামগ্রীগুলির একটি দর্শন।

@available(swift, deprecated: 3.2, message: "Please use String or Substring directly")
public var characters: String.CharacterView
func chopPrefix(_ count: Int = 1) -> String {
    if count >= 0 && count <= self.count {
        return self.substring(from: String.Index(encodedOffset: count))
    }
    return ""
}

func chopSuffix(_ count: Int = 1) -> String {
    if count >= 0 && count <= self.count {
        return self.substring(to: String.Index(encodedOffset: self.count - count))
    }
    return ""
}

সুইফট 4

extension String {

    func chopPrefix(_ count: Int = 1) -> String {
        if count >= 0 && count <= self.count {
            let indexStartOfText = self.index(self.startIndex, offsetBy: count)
            return String(self[indexStartOfText...])
        }
        return ""
    }

    func chopSuffix(_ count: Int = 1) -> String {
        if count >= 0 && count <= self.count {
            let indexEndOfText = self.index(self.endIndex, offsetBy: -count)
            return String(self[..<indexEndOfText])
        }
        return ""
    }
}

1
আমার মনে হয় আপনি চপসফিক্স ফাংশনে নেতিবাচক হিসাব যুক্ত করতে ভুলে গেছেন
অ্যান্ডি


10

আপনি শেষ ফলাফলটি কী চান তার উপর নির্ভর করে (পরিবর্তক বনাম ননমুটেশন)।

সুইফট ৪.১ অনুসারে:

mutating:

var str = "hello"
str.removeFirst() // changes str 

Nonmutating:

let str = "hello"
let strSlice = str.dropFirst() // makes a slice without the first letter
let str2 = String(strSlice)

মন্তব্য:

  • আমি nonmutatingস্বচ্ছতার জন্য উদাহরণে একটি অতিরিক্ত পদক্ষেপ রেখেছি । বিষয়গতভাবে, শেষ দুটি পদক্ষেপের সংমিশ্রণটি আরও সংক্ষিপ্ত হবে।
  • নামকরণটি dropFirstআমার কাছে কিছুটা অদ্ভুত বলে মনে হচ্ছে কারণ যদি আমি যদি সুইফট এপিআই ডিজাইনের গাইডলাইনগুলি সঠিকভাবে বুঝতে পারি তবে dropFirstসত্যই এমন কিছু হওয়া উচিত dropingFirstকারণ এটি নিরবচ্ছিন্ন is শুধু একটি ভাবনা :).

1
নিশ্চয়ই তা হওয়া উচিত droppingFirst- তারা গণ্ডগোল করেছে!
ফ্যাটি

6

এই সম্পর্কে কি?

s.removeAtIndex(s.startIndex)

এটি অবশ্যই ধরে নিয়েছে যে আপনার স্ট্রিংটি পরিবর্তনীয়। এটি মুছে ফেলা অক্ষরটি ফিরিয়ে দেয় তবে মূল স্ট্রিংকে পরিবর্তন করে।


6

পূর্ববর্তী উত্তরগুলি বেশ ভাল, তবে আজকের হিসাবে, আমি মনে করি এটি সুইফট 4-এ স্ট্রিং থেকে প্রথম চরিত্রটি সরিয়ে ফেলার সবচেয়ে সফল উপায় হতে পারে :

var line: String = "This is a string..."
var char: Character? = nil

char = line.removeFirst()

print("char = \(char)")  // char = T
print("line = \(line)")  // line = his is a string ...

1

আমি বাক্সের বাইরে আরও কিছু সাফল্যের কথা জানি না, তবে আপনি সহজেই উপসর্গটি প্রয়োগ করতে পারেন ++, যেমন,

public prefix func ++ <I: ForwardIndexType>(index: I) -> I {
    return advance(index, 1)
}

যার পরে আপনি এটিকে খুব সংক্ষিপ্তভাবে আপনার হৃদয়ের সামগ্রীতে ব্যবহার করতে পারেন:

str.substringFromIndex(++str.startIndex)

1

সুইফট 2 এ এই স্ট্রিং এক্সটেনশনটি ব্যবহার করুন:

extension String
{
    func substringFromIndex(index: Int) -> String
    {
        if (index < 0 || index > self.characters.count)
        {
            print("index \(index) out of bounds")
            return ""
        }
        return self.substringFromIndex(self.startIndex.advancedBy(index))
    }
}

display.text = display.text!.substringFromIndex(1)

1

"en_US, fr_CA, es_US" .চপসফিক্স (5) .চপপ্রিফিক্স (5) // ", ফ্র_সিএ,"

extension String {
    func chopPrefix(count: Int = 1) -> String {
        return self.substringFromIndex(self.startIndex.advancedBy(count))
    }

    func chopSuffix(count: Int = 1) -> String {
        return self.substringToIndex(self.endIndex.advancedBy(-count))
    }
}

0

স্ট্রিং থেকে প্রথম অক্ষর অপসারণ করতে

let choppedString = String(txtField.text!.characters.dropFirst())

@ জেসনফোগলিয়া আমি জানি না যে আপনি ভোট দিয়েছেন কি না। আপনি যদি ভোট দেয় তবে আপনি দয়া করে বিশদভাবে ব্যাখ্যা করতে পারেন।
হার্ডিক ঠাক্কার

আমি এটি পুনরায় পরীক্ষা করে দেখেছি যে এটি সঠিক। আমি উত্তরটি সম্পাদনা করেছি যাতে আমি এটিতে সঠিকভাবে ভোট দিতে পারি।
জেসন ফোগলিয়া

0

সম্প্রদায়ে রেখে এক্সটেনশনের একটি সুইফট 4 ক্র্যাশ সেভ সংস্করণ এখানে ...chopPrefixchopSuffix

extension String {
    func chopPrefix(_ count: Int = 1) -> String {
        return count>self.count ? self : String(self[index(self.startIndex, offsetBy: count)...])
    }
 }

0

Swift3

extension String {
    func chopPrefix(_ count: UInt = 1) -> String {
        return substring(from: characters.index(startIndex, offsetBy: Int(count)))
    }

    func chopSuffix(_ count: UInt = 1) -> String {
        return substring(to: characters.index(endIndex, offsetBy: -Int(count)))
    }
}

class StringChopTests: XCTestCase {
    func testPrefix() {
        XCTAssertEqual("original".chopPrefix(0), "original")
        XCTAssertEqual("Xfile".chopPrefix(), "file")
        XCTAssertEqual("filename.jpg".chopPrefix(4), "name.jpg")
    }

    func testSuffix() {
        XCTAssertEqual("original".chopSuffix(0), "original")
        XCTAssertEqual("fileX".chopSuffix(), "file")
        XCTAssertEqual("filename.jpg".chopSuffix(4), "filename")
    }
}

আমি মনে করি আপনার একটি পরীক্ষা যুক্ত করা উচিত যেখানে ইনপুটটি নেতিবাচক মানের হয়
মৌস্তফা বালবাকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.