Xóa ký tự cuối cùng khỏi chuỗi. Ngôn ngữ nhanh


241

Làm cách nào tôi có thể xóa ký tự cuối cùng khỏi biến String bằng Swift? Không thể tìm thấy nó trong tài liệu.

Dưới đây là ví dụ đầy đủ:

var expression = "45+22"
expression = expression.substringToIndex(countElements(expression) - 1)

2
2017, TRẢ LỜI HIỆN ĐẠI: stackoverflow.com/a/39410807/294884
Fattie

Câu trả lời:


537

Swift 4.0 (cũng là Swift 5.0)

var str = "Hello, World"                           // "Hello, World"
str.dropLast()                                     // "Hello, Worl" (non-modifying)
str                                                // "Hello, World"
String(str.dropLast())                             // "Hello, Worl"

str.remove(at: str.index(before: str.endIndex))    // "d"
str                                                // "Hello, Worl" (modifying)

Swift 3.0

Các API đã nhận được một chút khéo léo hơn và kết quả là phần mở rộng Foundation đã thay đổi một chút:

var name: String = "Dolphin"
var truncated = name.substring(to: name.index(before: name.endIndex))
print(name)      // "Dolphin"
print(truncated) // "Dolphi"

Hoặc phiên bản tại chỗ:

var name: String = "Dolphin"
name.remove(at: name.index(before: name.endIndex))
print(name)      // "Dolphi"

Cảm ơn Zmey, Rob Allen!

Cách Swift 2.0+

Có một vài cách để thực hiện điều này:

Thông qua phần mở rộng Foundation, mặc dù không phải là một phần của thư viện Swift:

var name: String = "Dolphin"
var truncated = name.substringToIndex(name.endIndex.predecessor())
print(name)      // "Dolphin"
print(truncated) // "Dolphi"

Sử dụng removeRange()phương pháp (mà làm thay đổi sự name):

var name: String = "Dolphin"    
name.removeAtIndex(name.endIndex.predecessor())
print(name) // "Dolphi"

Sử dụng dropLast()chức năng:

var name: String = "Dolphin"
var truncated = String(name.characters.dropLast())
print(name)      // "Dolphin"
print(truncated) // "Dolphi"

Chuỗi cũ. Index (Xcode 6 Beta 4 +) Cách

Stringcác loại trong Swift nhằm mục đích cung cấp hỗ trợ UTF-8 tuyệt vời, bạn không còn có thể truy cập các chỉ mục / phạm vi / chuỗi ký tự bằng cách sử dụng Intcác loại. Thay vào đó, bạn sử dụng String.Index:

let name: String = "Dolphin"
let stringLength = count(name) // Since swift1.2 `countElements` became `count`
let substringIndex = stringLength - 1
name.substringToIndex(advance(name.startIndex, substringIndex)) // "Dolphi"

Ngoài ra (đối với một ví dụ thực tế hơn, nhưng ít giáo dục hơn), bạn có thể sử dụng endIndex:

let name: String = "Dolphin"
name.substringToIndex(name.endIndex.predecessor()) // "Dolphi"

Lưu ý: Tôi thấy đây là điểm khởi đầu tuyệt vời để hiểuString.Index

Cách cũ (tiền Beta 4)

Bạn chỉ có thể sử dụng substringToIndex()hàm, cung cấp cho nó ít hơn một chiều dài của String:

let name: String = "Dolphin"
name.substringToIndex(countElements(name) - 1) // "Dolphi"

Trên Xcode 6 beta 6: 'Chuỗi' không có thành viên có tênsubstringToIndex
ielyamani

2
Này, đứng lên, chắc chắn là substringToIndexkhông substringFromIndex. Nó không làm cho bạn cảm thấy thông minh nhầm lẫn điều này, hãy để tôi nói với bạn.
Louie Bertoncin

2
Điều này là đúng, kể từ ngày 21 tháng 7, Xcode 7 Beta 4 nói rằng 'Chuỗi' không có tên thành viên substringToIndex. Ngoài ra, kể từ Xcode 7, chuỗi không còn có thuộc .counttính, giờ đây nó chỉ được áp dụng cho các ký tự:string.characters.count
kakubei

2
Swift 3:var truncated = name.substring(to: name.index(before: name.endIndex))
Zmey

2
Câu trả lời của bạn là lịch sử của sự tiến hóa Swift.
DawnSong

89

Hàm toàn cục dropLast()hoạt động theo trình tự và do đó trên Chuỗi:

var expression  = "45+22"
expression = dropLast(expression)  // "45+2"

// in Swift 2.0 (according to cromanelli's comment below)
expression = String(expression.characters.dropLast())

3
Trong Swift 2.0, thuộc characterstính trên Chuỗi xuất ra một chuỗi, do đó bây giờ bạn phải sử dụng: expression = expression.characters.dropLast()
gui_dos

5
Trong Swift 2.0, bạn phải sử dụng đúng kết quả expression = String(expression.characters.dropLast())nếu bạn muốn nó trở lại dưới dạng Chuỗi
cromanelli

69

Swift 4:

let choppedString = String(theString.dropLast())

Trong Swift 2, làm điều này:

let choppedString = String(theString.characters.dropLast())

Tôi khuyên bạn nên liên kết này để hiểu về chuỗi Swift.



8

Đây là một hình thức mở rộng chuỗi :

extension String {

    func removeCharsFromEnd(count_:Int) -> String {
        let stringLength = count(self)

        let substringIndex = (stringLength < count_) ? 0 : stringLength - count_

        return self.substringToIndex(advance(self.startIndex, substringIndex))
    }
}

cho các phiên bản Swift sớm hơn 1.2:

...
let stringLength = countElements(self)
...

Sử dụng:

var str_1 = "Maxim"
println("output: \(str_1.removeCharsFromEnd(1))") // "Maxi"
println("output: \(str_1.removeCharsFromEnd(3))") // "Ma"
println("output: \(str_1.removeCharsFromEnd(8))") // ""

Tài liệu tham khảo:

Phần mở rộng thêm chức năng mới cho một lớp, cấu trúc hoặc kiểu liệt kê hiện có. Điều này bao gồm khả năng mở rộng các loại mà bạn không có quyền truy cập vào mã nguồn gốc (được gọi là mô hình hồi tố). Các phần mở rộng tương tự như các thể loại trong Objective-C. (Không giống như danh mục Objective-C, tiện ích mở rộng Swift không có tên.)

Xem DOCS


Xin chào, bạn đã thử biểu tượng cảm xúc chưa?
ZYiOS

@ZuYuan biểu tượng cảm xúc là gì?
Maxim Shoustin

6

Sử dụng chức năng removeAtIndex(i: String.Index) -> Character:

var s = "abc"    
s.removeAtIndex(s.endIndex.predecessor())  // "ab"

5

Cách dễ nhất để cắt ký tự cuối cùng của chuỗi là:

title = title[title.startIndex ..< title.endIndex.advancedBy(-1)]

Cảm ơn bạn, một cách rất thanh lịch để loại bỏ bao nhiêu ký tự bạn muốn từ cuối chuỗi.
Letaief Achraf

5

Swift 4

var welcome = "Hello World!"
welcome = String(welcome[..<welcome.index(before:welcome.endIndex)])

hoặc là

welcome.remove(at: welcome.index(before: welcome.endIndex))

hoặc là

welcome = String(welcome.dropLast())

2
let str = "abc"
let substr = str.substringToIndex(str.endIndex.predecessor())  // "ab"

2
var str = "Hello, playground"

extension String {
    var stringByDeletingLastCharacter: String {
        return dropLast(self)
    }
}

println(str.stringByDeletingLastCharacter)   // "Hello, playgroun"

kkkk tôi thậm chí không nhớ cái này (Swift 1.2 ở trên). cho phiên bản Swift 3 stackoverflow.com/a/40028338/2303865
Leo Dabus

2

Một thể loại nhanh chóng đang biến đổi:

extension String {
    mutating func removeCharsFromEnd(removeCount:Int)
    {
        let stringLength = count(self)
        let substringIndex = max(0, stringLength - removeCount)
        self = self.substringToIndex(advance(self.startIndex, substringIndex))
    }
}

Sử dụng:

var myString = "abcd"
myString.removeCharsFromEnd(2)
println(myString) // "ab"

2

Câu trả lời ngắn (có giá trị từ 2015-04-16): removeAtIndex(myString.endIndex.predecessor())

Thí dụ:

var howToBeHappy = "Practice compassion, attention and gratitude. And smile!!"
howToBeHappy.removeAtIndex(howToBeHappy.endIndex.predecessor())
println(howToBeHappy)
// "Practice compassion, attention and gratitude. And smile!"

Meta:

Ngôn ngữ tiếp tục sự phát triển nhanh chóng của nó, làm cho thời gian bán hủy cho nhiều câu trả lời SO tốt trước đây rất ngắn gọn. Luôn luôn tốt nhất để học ngôn ngữ và tham khảo tài liệu thực tế .


2

Với cách sử dụng loại Chuỗi con mới:

Swift 4:

var before: String = "Hello world!"
var lastCharIndex: Int = before.endIndex
var after:String = String(before[..<lastCharIndex])
print(after) // Hello world

Đường ngắn hơn:

var before: String = "Hello world!"
after = String(before[..<before.endIndex])
print(after) // Hello world

1

Sử dụng chức năng advance(startIndex, endIndex):

var str = "45+22"
str = str.substringToIndex(advance(str.startIndex, countElements(str) - 1))

1

Một cách khác Nếu bạn muốn xóa một hoặc nhiều hơn một ký tự từ cuối.

var myStr = "Hello World!"
myStr = (myStr as NSString).substringToIndex((myStr as NSString).length-XX)

Trong đó XX là số lượng ký tự bạn muốn xóa.


1

Swift 3 (theo các tài liệu ) ngày 20 tháng 11 năm 2016

let range = expression.index(expression.endIndex, offsetBy: -numberOfCharactersToRemove)..<expression.endIndex
expression.removeSubrange(range)

0

Tôi khuyên bạn nên sử dụng NSString cho các chuỗi mà bạn muốn thao tác. Trên thực tế, hãy nghĩ về nó như một nhà phát triển Tôi chưa bao giờ gặp phải vấn đề với NSString mà Swift String sẽ giải quyết ... Tôi hiểu sự tinh tế. Nhưng tôi vẫn chưa có nhu cầu thực sự cho họ.

var foo = someSwiftString as NSString

hoặc là

var foo = "Foo" as NSString

hoặc là

var foo: NSString = "blah"

Và sau đó, toàn bộ thế giới của các hoạt động chuỗi NSString đơn giản được mở cho bạn.

Như trả lời cho câu hỏi

// check bounds before you do this, e.g. foo.length > 0
// Note shortFoo is of type NSString
var shortFoo = foo.substringToIndex(foo.length-1)

0

Các dropLast()chức năng loại bỏ yếu tố cuối cùng của chuỗi.

var expression = "45+22"
expression = expression.dropLast()

0

Swift 3 : Khi bạn muốn xóa chuỗi theo dõi:

func replaceSuffix(_ suffix: String, replacement: String) -> String {
    if hasSuffix(suffix) {
        let sufsize = suffix.count < count ? -suffix.count : 0
        let toIndex = index(endIndex, offsetBy: sufsize)
        return substring(to: toIndex) + replacement
    }
    else
    {
        return self
    }
}

0

Swift 4.2

Tôi cũng xóa ký tự cuối cùng của mình khỏi Chuỗi (tức là văn bản UILabel ) trong ứng dụng IOS

@IBOutlet weak var labelText: UILabel! // Do Connection with UILabel

@IBAction func whenXButtonPress(_ sender: UIButton) { // Do Connection With X Button

    labelText.text = String((labelText.text?.dropLast())!) // Delete the last caracter and assign it

}

Câu chuyện ứng dụng iOS


0
import UIKit

var str1 = "Hello, playground"
str1.removeLast()
print(str1)

var str2 = "Hello, playground"
str2.removeLast(3)
print(str2)

var str3 = "Hello, playground"
str3.removeFirst(2)
print(str3)

Output:-
Hello, playgroun
Hello, playgro
llo, playground

0

miễn phí với đoạn mã trên Tôi muốn xóa phần đầu của chuỗi và không thể tìm thấy tài liệu tham khảo ở bất cứ đâu. Đây là cách tôi đã làm nó:

var mac = peripheral.identifier.description
let range = mac.startIndex..<mac.endIndex.advancedBy(-50)
mac.removeRange(range)  // trim 17 characters from the beginning
let txPower = peripheral.advertisements.txPower?.description

Điều này cắt 17 ký tự từ đầu chuỗi (tổng chiều dài chuỗi là 67 chúng tôi tăng -50 từ cuối và bạn có nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.