Dizeden son karakteri kaldır. Hızlı dil


Yanıtlar:


539

Swift 4.0 (ayrıca 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

API'lar biraz daha değişti ve bunun sonucunda Foundation uzantısı biraz değişti:

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

Veya yerinde sürüm:

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

Teşekkürler Zmey, Rob Allen!

Swift 2.0+ Yolu

Bunu başarmanın birkaç yolu vardır:

Swift kütüphanesinin bir parçası olmamasına rağmen Foundation uzantısı aracılığıyla:

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

Kullanarak removeRange()(ki burada yöntem değiştirirname ):

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

dropLast()Fonksiyonunu kullanarak :

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

Eski String Index (Xcode 6 Beta 4 +) Yolu

Yana StringSwift tipleri mükemmel UTF-8 desteği sağlamak amacı, artık erişim karakter indeksleri / aralıkları / altdizgelerin kullanarak yapabilirsiniz Inttürlerini. Bunun yerine şunları kullanırsınız 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"

Alternatif olarak (daha pratik, ancak daha az eğitici bir örnek için) şunları kullanabilirsiniz endIndex:

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

Not: Bulduğum bu anlayış için harika bir başlangıç noktası olarakString.Index

Eski (Beta 4 öncesi) Yol

substringToIndex()Fonksiyonu, uzunluğundan daha kısa bir süre sağlayarak kullanabilirsiniz String:

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

Xcode 6'da beta 6: 'String' adlı bir üyesi yoksubstringToIndex
ielyamani

2
Hey, dikkat edin, substringToIndexolmadığından emin olun substringFromIndex. Bunu yanlış bir şekilde zavallı hissetmenize neden olmaz, size söyleyeyim.
Louie Bertoncin

2
Bu, 21 Temmuz itibariyle Xcode 7 Beta 4'ün 'String' adlı bir üyesi olmadığını söylüyor substringToIndex. Ayrıca, Xcode 7'den itibaren dize artık bir .countözelliğe sahip değil, artık sadece karakterlere uygulanıyor:string.characters.count
kakubei

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

2
Cevabınız Swift evriminin tarihidir.
DawnSong

89

Küresel dropLast()işlev diziler ve dolayısıyla Dizeler üzerinde çalışır:

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
Swift 2.0'da charactersbir String üzerindeki özellik bir dizi verir, bu nedenle şimdi şunları kullanmalısınız: expression = expression.characters.dropLast()
gui_dos

5
Swift 2.0 için expression = String(expression.characters.dropLast())bir dize olarak geri isterseniz düzgün sonuç vermek zorunda
cromanelli

69

Hızlı 4:

let choppedString = String(theString.dropLast())

Swift 2'de şunu yapın:

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

Swift dizelerini anlamak için bu bağlantıyı öneriyorum .


9

Hızlı 4/5

var str = "bla"
str.removeLast() // returns "a"; str is now "bl"

8

Bu bir String Uzantısı Formudur:

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))
    }
}

Swift'in 1.2'den önceki sürümleri için:

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

Kullanımı:

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

Referans:

Uzantılar, varolan bir sınıfa, yapıya veya numaralandırma türüne yeni işlevler ekler. Bu, orijinal kaynak koduna (geriye dönük modelleme olarak bilinir) erişiminiz olmayan türleri genişletme özelliğini de içerir. Uzantılar Objective-C'deki kategorilere benzer. (Objective-C kategorilerinden farklı olarak, Swift uzantılarının adları yoktur.)

Bkz. DOCS


Merhaba, emojiyi test ettin mi?
ZYiOS

@ZuYuan emoji nedir?
Maxim Shoustin

6

İşlevi kullanın removeAtIndex(i: String.Index) -> Character:

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

5

Dizenin son karakterini kırpmanın en kolay yolu:

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

Teşekkür ederim, bir dizenin sonundan istediğiniz kadar karakteri kaldırmak için çok zarif bir yol.
Letaief Achraf

5

Hızlı 4

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

veya

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

veya

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 Bunu hatırlamıyorum bile (yukarıdaki Swift 1.2). Swift 3 sürümü için stackoverflow.com/a/40028338/2303865
Leo Dabus

2

Değişen hızlı bir kategori:

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

kullanın:

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

2

Kısa cevap (2015-04-16 tarihinden itibaren geçerlidir): removeAtIndex(myString.endIndex.predecessor())

Misal:

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

Meta:

Dil, hızlı evrimine devam eder ve eski iyi SO cevaplarının yarı ömrünü tehlikeli bir şekilde kısaltır. Dili öğrenmek ve gerçek belgelere başvurmak her zaman en iyisidir .


2

Yeni Alt dize tipi kullanımı ile:

Hızlı 4:

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

Daha kısa yol:

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

1

İşlevi kullanın advance(startIndex, endIndex):

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

1

Başka bir yol Bir veya birden fazla karakteri sondan kaldırmak istiyorsanız .

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

Burada XX , kaldırmak istediğiniz karakter sayısıdır.


1

Swift 3 ( dokümanlara göre ) 20 Kasım 2016

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

0

Değiştirmek istediğiniz dizeler için NSString kullanmanızı öneririm. Aslında bunu bir geliştirici olarak düşünmeye geldim, Swift String'in çözeceği NSString ile hiç bir sorunla karşılaşmadım ... incelikleri anlıyorum. Ama henüz onlara gerçekten ihtiyacım yok.

var foo = someSwiftString as NSString

veya

var foo = "Foo" as NSString

veya

var foo: NSString = "blah"

Ve sonra basit NSString string işlemlerinin tüm dünyası size açık.

Sorunun cevabı olarak

// 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

dropLast()İşlev dizesi son öğe kaldırır.

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

0

Swift 3 : Sondaki dizeyi kaldırmak istediğinizde:

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

Hızlı 4.2

Ayrıca son karakterimi IOS uygulamasında String'den (yani UILabel metni ) siliyorum

@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

}

İOS Uygulama StoryBoard


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

Yukarıdaki kod ücretsiz ben dize başlangıcı kaldırmak istedim ve hiçbir yerde bir referans bulamadık. İşte nasıl yaptım:

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

Bu, dizenin başlangıcından itibaren 17 karakteri düzeltir (toplam dize uzunluğu 67'dir, sondan -50 ilerleriz ve orada vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.