สวิฟท์มีวิธีการเล็มบน String หรือไม่?


393

สวิฟท์มีวิธีการเล็มบน String หรือไม่? ตัวอย่างเช่น:

let result = " abc ".trim()
// result == "abc"

4
@mattdipasquale trim เป็นชื่อที่พบบ่อยมากสำหรับการดำเนินการนี้
Austin

คำตอบ:


831

Stringนี่คือวิธีการที่คุณเอาทุกช่องว่างจากจุดเริ่มต้นและจุดสิ้นสุดของ

(ตัวอย่างทดสอบกับSwift 2.0 )

let myString = "  \t\t  Let's trim all the whitespace  \n \t  \n  "
let trimmedString = myString.stringByTrimmingCharactersInSet(
    NSCharacterSet.whitespaceAndNewlineCharacterSet()
)
// Returns "Let's trim all the whitespace"

(ตัวอย่างทดสอบกับSwift 3+ )

let myString = "  \t\t  Let's trim all the whitespace  \n \t  \n  "
let trimmedString = myString.trimmingCharacters(in: .whitespacesAndNewlines)
// Returns "Let's trim all the whitespace"

หวังว่านี่จะช่วยได้


จะไม่ทำงานบน swif 1.2 เนื่องจากไม่มีการประชุมอัตโนมัติจาก String ไปยัง NSString
elcuco

5
มันทำงานได้ดีใน Swift 1.2 - วัตถุ String มีวิธี stringByTrimmingCharactersInSet (ไม่ใช่ NSString เอกสิทธิ์)
Ben Dodson

8
ใน Swift 3.0 คือ: let trimmedString = myString.trimmingCharacters (ใน: .whitespaces)
kikettas

6
ไม่ได้หมายความว่ามันล้าสมัย ไม่ใช่ทุกคนที่ใช้ Swift 3.0
c.dunlap

2
ใน Swift 3.0 จะไม่ลบช่องว่างสีขาวในระหว่างสตริง มันจะลบช่องว่างสีขาวนำหน้าและต่อท้ายเท่านั้น สำหรับที่อ้างถึงคำตอบนี้: stackoverflow.com/a/39067610/4886069

130

ใส่รหัสนี้ในไฟล์ในโครงการของคุณมีสิ่งที่ชอบ Utils.swift:

extension String
{   
    func trim() -> String
    {
        return self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
    }
}

ดังนั้นคุณจะสามารถทำสิ่งนี้:

let result = " abc ".trim()
// result == "abc"

โซลูชัน Swift 3.0

extension String
{   
    func trim() -> String
   {
    return self.trimmingCharacters(in: NSCharacterSet.whitespaces)
   }
}

ดังนั้นคุณจะสามารถทำสิ่งนี้:

let result = " Hello World ".trim()
// result = "HelloWorld"

2
ปลอดภัยไหม ฉันจะป้องกันการชนกันของชื่อเมธอดได้อย่างไรถ้า Apple หรือบางไลบรารีของบุคคลที่สามเพิ่มเมธอดเดียวกันให้String?
ma11hew28

12
ส่วนขยายปลอดภัย - และในความจริงแล้ว Apple ใช้ประโยชน์อย่างเต็มที่ใน API ภายใน คุณไม่สามารถป้องกันการชนชื่อใด ๆ และนี่เป็นเรื่องดี คุณจะได้รับข้อผิดพลาดในการคอมไพล์เมื่อ Apple เพิ่มเมธอด trim () ในที่สุดและคุณจะรู้ว่าไม่จำเป็นต้องใช้ส่วนขยายอีกต่อไป ส่วนขยายค่อนข้างหรูหราและวางวิธีการที่คุณต้องการมากกว่าคลาสยูทิลิตี้ที่ไม่ชัดเจนเช่น StringUtils ปัญหาที่ฉันมีคือเมื่อคลาสไม่มีวิธีที่ฉันต้องการเนื่องจากเฟรมเวิร์กอื่นไม่ได้ถูกอิมพอร์ตซึ่งเพิ่มส่วนขยายเข้าไป
absmiths

3
เฮ้ใน Swift 3 ควรกลับมาreturn self.trimmingCharacters(in: .whitespacesAndNewlines)

7
ให้ผลลัพธ์ = "Hello World" .trim () // result = "HelloWorld" นี่จะไม่ลบช่องว่างที่อยู่ในสตริง จะ remve ช่องว่างนำหน้าและต่อท้ายเท่านั้น
Sahil

2
นี่จะไม่ลบช่องว่างระหว่างสตริง มันลบเฉพาะพื้นที่ชั้นนำและต่อท้าย ดังนั้นวิธีที่ดีกว่าในการลบช่องว่างระหว่างสตริงคือการใช้ข้อความของคุณหรือไม่. การแทนที่ขอบเขต (จาก: "", กับ: "") แทนที่จะใช้ trimmingCharacters
Umesh Sawant

57

ใน Swift 3.0

extension String
{   
    func trim() -> String
   {
    return self.trimmingCharacters(in: CharacterSet.whitespaces)
   }
}

และคุณสามารถโทร

let result = " Hello World ".trim()  /* result = "Hello World" */

4
ถ้าฉันต้องการตัดส่วนต่อท้ายและช่องว่างนำหน้าจะทำอย่างไร
Suragch

1
ฉันยังใหม่กับการขยาย 3 อย่างรวดเร็ว หากไลบรารีแก้ไขสตริงและฉันก็ปรับเปลี่ยนสตริงเป็นไปได้หรือไม่ที่จะได้รับการชน จะเกิดอะไรขึ้นถ้า swift ad ในอนาคตวิธีการ trim () ดังนั้น .. โดยทั่วไป .. ส่วนขยายปลอดภัยที่จะใช้เช่นนี้หรือไม่
Gattster

1
เป็นไปได้ที่จะได้รับการชน
Alex Brown

ให้ผลลัพธ์ = "Hello World" .trim () // result = "HelloWorld" นี่จะไม่ลบช่องว่างที่อยู่ในสตริง จะ remve เฉพาะช่องว่างนำหน้าและต่อท้ายเท่านั้น
Sahil


21

สวิฟท์ 3

let result = " abc ".trimmingCharacters(in: .whitespacesAndNewlines)


วันที่คาดว่าการเปิดตัว: Late 2016
Warif Akhand ฤๅษี

1
จริงๆแล้วมันคือ "whitespacesAndNewlines", ฮ่า ๆ , เหลือคนเดียว
RainCast

9

ใช่แล้วคุณสามารถทำสิ่งนี้ได้:

var str = "  this is the answer   "
str = str.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
print(srt) // "this is the answer"

CharacterSet เป็นเครื่องมือที่ทรงพลังจริงๆในการสร้างกฎการตัดแต่งที่มีความยืดหยุ่นมากกว่าชุดที่กำหนดไว้ล่วงหน้าเช่น. whitepacesAndNewlines

ตัวอย่างเช่น:

var str = " Hello World !"
let cs = CharacterSet.init(charactersIn: " !")
str = str.trimmingCharacters(in: cs)
print(str) // "Hello World"

6

ตัดสตริงให้มีความยาวเฉพาะ

หากคุณป้อนบล็อกของประโยค / ข้อความและคุณต้องการบันทึกเฉพาะความยาวที่ระบุจากข้อความ เพิ่มส่วนขยายต่อไปนี้เป็น Class

extension String {

   func trunc(_ length: Int) -> String {
    if self.characters.count > length {
        return self.substring(to: self.characters.index(self.startIndex, offsetBy: length))
    } else {
        return self
    }
  }

  func trim() -> String{
     return self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
   }

}

ใช้

var str = "Lorem Ipsum is simply dummy text of the printing and typesetting industry."
//str is length 74
print(str)
//O/P:  Lorem Ipsum is simply dummy text of the printing and typesetting industry.

str = str.trunc(40)
print(str)
//O/P: Lorem Ipsum is simply dummy text of the 


5

อีกวิธีที่คล้ายกัน:

extension String {
    var trimmed:String {
        return self.trimmingCharacters(in: CharacterSet.whitespaces)
    }
}

ใช้:

let trimmedString = "myString ".trimmed

4
extension String {
    /// EZSE: Trims white space and new line characters
    public mutating func trim() {
         self = self.trimmed()
    }

    /// EZSE: Trims white space and new line characters, returns a new string
    public func trimmed() -> String {
        return self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
    }
}

นำมาจาก repo ของฉันนี้: https://github.com/goktugyil/EZSwiftExtensions/commit/609fce34a41f98733f97dfd7b4c23b5d16416206


ฉันชอบคำกริยาที่สอดคล้องได้อย่างรวดเร็วสำหรับการไม่กลายพันธุ์
Alex Brown

4

ใน Swift3 XCode 8 Final

สังเกตว่าCharacterSet.whitespacesไม่ใช่ฟังก์ชั่นอีกต่อไป!

(ไม่เป็นNSCharacterSet.whitespaces)

extension String {
    func trim() -> String {
        return self.trimmingCharacters(in: CharacterSet.whitespaces)
    }
}

3

// Swift 4.0 ลบช่องว่างและบรรทัดใหม่

extension String {
    func trim() -> String {
        return self.trimmingCharacters(in: .whitespacesAndNewlines)         
    }
}

2

คุณยังสามารถส่งอักขระที่คุณต้องการตัดแต่ง

extension String {


    func trim() -> String {

        return self.trimmingCharacters(in: .whitespacesAndNewlines)

    }

    func trim(characterSet:CharacterSet) -> String {

        return self.trimmingCharacters(in: characterSet)

    }
}

validationMessage = validationMessage.trim(characterSet: CharacterSet(charactersIn: ","))

0

ฉันสร้างฟังก์ชั่นนี้ที่อนุญาตให้ใส่สตริงและส่งคืนรายการสตริงที่ถูกตัดแต่งโดยตัวละครใด ๆ

 func Trim(input:String, character:Character)-> [String]
{
    var collection:[String] = [String]()
    var index  = 0
    var copy = input
    let iterable = input
    var trim = input.startIndex.advancedBy(index)

    for i in iterable.characters

    {
        if (i == character)
        {

            trim = input.startIndex.advancedBy(index)
            // apennding to the list
            collection.append(copy.substringToIndex(trim))

            //cut the input
            index += 1
            trim = input.startIndex.advancedBy(index)
            copy = copy.substringFromIndex(trim)

            index = 0
        }
        else
        {
            index += 1
        }
    }
    collection.append(copy)
    return collection

}

อย่างที่ไม่พบวิธีการทำสิ่งนี้ใน swift (คอมไพล์และทำงานอย่างสมบูรณ์แบบใน swift 2.0)


2
คุณสามารถกำหนดสิ่งที่คุณหมายถึงโดย 'ตัด' ด้วยตัวอย่าง เนื่องจากประเภทที่ส่งคืนของคุณคือ [String] คุณจึงไม่สามารถใช้งานสิ่งที่ OP ร้องขอได้ (ซึ่งส่งคืนสตริง)
Alex Brown

0

อย่าลืมให้หรือimport FoundationUIKit

import Foundation
let trimmedString = "   aaa  "".trimmingCharacters(in: .whitespaces)
print(trimmedString)

ผลลัพธ์:

"aaa"

มิฉะนั้นคุณจะได้รับ:

error: value of type 'String' has no member 'trimmingCharacters'
    return self.trimmingCharacters(in: .whitespaces)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.