How can I remove last character from String variable using Swift? Can't find it in documentation.
Here is full example:
var expression = "45+22" expression = expression.substringToIndex(countElements(expression) - 1) How can I remove last character from String variable using Swift? Can't find it in documentation.
Here is full example:
var expression = "45+22" expression = expression.substringToIndex(countElements(expression) - 1) Swift 4.0 (also 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
The APIs have gotten a bit more swifty, and as a result the Foundation extension has changed a bit:
var name: String = "Dolphin" var truncated = name.substring(to: name.index(before: name.endIndex)) print(name) // "Dolphin" print(truncated) // "Dolphi" Or the in-place version:
var name: String = "Dolphin" name.remove(at: name.index(before: name.endIndex)) print(name) // "Dolphi" Thanks Zmey, Rob Allen!
Swift 2.0+ Way
There are a few ways to accomplish this:
Via the Foundation extension, despite not being part of the Swift library:
var name: String = "Dolphin" var truncated = name.substringToIndex(name.endIndex.predecessor()) print(name) // "Dolphin" print(truncated) // "Dolphi" Using the removeRange() method (which alters the name):
var name: String = "Dolphin" name.removeAtIndex(name.endIndex.predecessor()) print(name) // "Dolphi" Using the dropLast() function:
var name: String = "Dolphin" var truncated = String(name.characters.dropLast()) print(name) // "Dolphin" print(truncated) // "Dolphi" Old String.Index (Xcode 6 Beta 4 +) Way
Since String types in Swift aim to provide excellent UTF-8 support, you can no longer access character indexes/ranges/substrings using Int types. Instead, you use 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" Alternatively (for a more practical, but less educational example) you can use endIndex:
let name: String = "Dolphin" name.substringToIndex(name.endIndex.predecessor()) // "Dolphi" Note: I found this to be a great starting point for understanding String.Index
Old (pre-Beta 4) Way
You can simply use the substringToIndex() function, providing it one less than the length of the String:
let name: String = "Dolphin" name.substringToIndex(countElements(name) - 1) // "Dolphi" substringToIndexsubstringToIndex not substringFromIndex. It doesn't make you feel intelligent mistaking this, let me tell you.substringToIndex. Also, as of Xcode 7, string no longer has a .count property, it is now only applied to characters: string.characters.countvar truncated = name.substring(to: name.index(before: name.endIndex))The global dropLast() function works on sequences and therefore on Strings:
var expression = "45+22" expression = dropLast(expression) // "45+2" // in Swift 2.0 (according to cromanelli's comment below) expression = String(expression.characters.dropLast()) characters property on a String outputs a sequence, therefore now you have to use: expression = expression.characters.dropLast()expression = String(expression.characters.dropLast()) if you want it back as a StringThis is a String Extension Form:
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)) } } for versions of Swift earlier than 1.2:
... let stringLength = countElements(self) ... Usage:
var str_1 = "Maxim" println("output: \(str_1.removeCharsFromEnd(1))") // "Maxi" println("output: \(str_1.removeCharsFromEnd(3))") // "Ma" println("output: \(str_1.removeCharsFromEnd(8))") // "" Reference:
Extensions add new functionality to an existing class, structure, or enumeration type. This includes the ability to extend types for which you do not have access to the original source code (known as retroactive modeling). Extensions are similar to categories in Objective-C. (Unlike Objective-C categories, Swift extensions do not have names.)
See DOCS
The easiest way to trim the last character of the string is:
title = title[title.startIndex ..< title.endIndex.advancedBy(-1)] var str = "Hello, playground" extension String { var stringByDeletingLastCharacter: String { return dropLast(self) } } println(str.stringByDeletingLastCharacter) // "Hello, playgroun" Short answer (valid as of 2015-04-16): removeAtIndex(myString.endIndex.predecessor())
Example:
var howToBeHappy = "Practice compassion, attention and gratitude. And smile!!" howToBeHappy.removeAtIndex(howToBeHappy.endIndex.predecessor()) println(howToBeHappy) // "Practice compassion, attention and gratitude. And smile!" Meta:
The language continues its rapid evolution, making the half-life for many formerly-good S.O. answers dangerously brief. It's always best to learn the language and refer to real documentation.
With the new Substring type usage:
var before: String = "Hello world!" var lastCharIndex: Int = before.endIndex var after:String = String(before[..<lastCharIndex]) print(after) // Hello world Shorter way:
var before: String = "Hello world!" after = String(before[..<before.endIndex]) print(after) // Hello world A swift category that's mutating:
extension String { mutating func removeCharsFromEnd(removeCount:Int) { let stringLength = count(self) let substringIndex = max(0, stringLength - removeCount) self = self.substringToIndex(advance(self.startIndex, substringIndex)) } } Use:
var myString = "abcd" myString.removeCharsFromEnd(2) println(myString) // "ab" Swift 3 (according to the docs) 20th Nov 2016
let range = expression.index(expression.endIndex, offsetBy: -numberOfCharactersToRemove)..<expression.endIndex expression.removeSubrange(range) Swift 4.2
I also delete my last character from String (i.e. UILabel text) in IOS app
@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 } I'd recommend using NSString for strings that you want to manipulate. Actually come to think of it as a developer I've never run into a problem with NSString that Swift String would solve... I understand the subtleties. But I've yet to have an actual need for them.
var foo = someSwiftString as NSString or
var foo = "Foo" as NSString or
var foo: NSString = "blah" And then the whole world of simple NSString string operations is open to you.
As answer to the question
// check bounds before you do this, e.g. foo.length > 0 // Note shortFoo is of type NSString var shortFoo = foo.substringToIndex(foo.length-1) Swift 3: When you want to remove trailing string:
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 } } complimentary to the above code I wanted to remove the beginning of the string and could not find a reference anywhere. Here is how I did it:
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 This trims 17 characters from the beginning of the string (he total string length is 67 we advance -50 from the end and there you have it.