Saya ingin menghapus karakter pertama dari string. Sejauh ini, hal paling ringkas yang saya temukan adalah:
display.text = display.text!.substringFromIndex(advance(display.text!.startIndex, 1))
Saya tahu kami tidak dapat mengindeks string dengan Int
karena Unicode, tetapi solusi ini tampaknya sangat bertele-tele. Apakah ada cara lain yang saya abaikan?
advance
semuanya dengan mentransmisikandisplay.text!
ke NSString. Saya tidak mengatakan itu solusi yang baik - hanya mengoreksi kemungkinan kesalahpahaman. Dengan NSString, Anda dapat mengindeksnya dengan Int. - Dan alasan Anda tidak dapat mengindeks dengan Int bukan karena Unicode; itu karena Karakter dapat terdiri dari beberapa titik kode gabungan.String
maka Swift 3 telah memperkenalkancapitalized
fungsi keString
.Jawaban:
Jika Anda menggunakan Swift 3 , Anda dapat mengabaikan bagian kedua dari jawaban ini. Kabar baiknya adalah, ini sekarang menjadi ringkas lagi! Hanya menggunakan metode remove (at :) baru dari String.
Saya suka
dropFirst()
fungsi global untuk ini.Singkat, jelas, dan berfungsi untuk apa pun yang sesuai dengan protokol Sliceable.
Jika Anda menggunakan Swift 2 , jawaban ini telah berubah. Anda masih dapat menggunakan dropFirst, tetapi tidak tanpa menghapus karakter pertama dari
characters
properti string Anda dan kemudian mengonversi hasilnya kembali ke String. dropFirst juga menjadi metode, bukan fungsi.Alternatif lain adalah menggunakan fungsi sufiks untuk memisahkan string
UTF16View
. Tentu saja, ini juga harus diubah kembali menjadi String.Semua ini untuk mengatakan bahwa solusi yang awalnya saya berikan ternyata bukan cara paling ringkas untuk melakukan ini di versi Swift yang lebih baru. Saya sarankan untuk kembali menggunakan solusi @chris '
removeAtIndex()
jika Anda mencari solusi yang singkat dan intuitif.Dan seperti yang ditunjukkan oleh @vacawama pada komentar di bawah, opsi lain yang tidak mengubah String asli adalah menggunakan substringFromIndex.
Atau jika Anda kebetulan ingin melepaskan karakter dari awal dan akhir String, Anda dapat menggunakan substringWithRange. Pastikan untuk menjaga terhadap kondisi kapan
startIndex + n > endIndex - m
.Baris terakhir juga dapat ditulis dengan menggunakan notasi subskrip.
sumber
remove(at:)
metode ini: itu karakter yang dihapus, bukan string baru. Misalnyalet removedCharacter = myString.remove(at: myString.startIndex)
,. Saya membuat kesalahan dengan mengembalikan hasil pemanggilan metode, lupa bahwa ini adalah kasus dalam pendekatan ini. Selamat membuat kode semuanya!Pembaruan untuk Swift 4
Di Swift 4,
String
menyesuaikanCollection
lagi, sehingga memungkinkan untuk menggunakandropFirst
dandropLast
memangkas awal dan akhir string. Hasilnya adalah tipeSubstring
, jadi Anda harus meneruskannya keString
konstruktor untuk mendapatkan kembaliString
:dropFirst()
dandropLast()
juga gunakanInt
untuk menentukan jumlah karakter yang akan dihapus:Jika Anda menentukan lebih banyak karakter untuk dilepaskan daripada di string, hasilnya akan menjadi string kosong (
""
).Pembaruan untuk Swift 3
Jika Anda hanya ingin menghapus karakter pertama dan ingin mengubah string asli pada tempatnya, lihat jawaban @ MickMacCallum. Jika Anda ingin membuat string baru dalam prosesnya, gunakan
substring(from:)
. Dengan ekstensi keString
, Anda dapat menyembunyikan keburukan darisubstring(from:)
dansubstring(to:)
membuat tambahan yang berguna untuk memangkas awal dan akhir dariString
:Seperti
dropFirst
dandropLast
sebelumnya, fungsi ini akan macet jika tidak ada cukup huruf yang tersedia di String. Tanggung jawab ada pada pemanggil untuk menggunakannya dengan benar. Ini adalah keputusan desain yang valid. Seseorang dapat menulisnya untuk mengembalikan opsional yang kemudian harus dibuka oleh pemanggil.Swift 2.x
Sayangnya di Swift 2 ,
dropFirst
dandropLast
(solusi terbaik sebelumnya) tidak senyaman sebelumnya. Dengan ekstensi keString
, Anda dapat menyembunyikan keburukansubstringFromIndex
dansubstringToIndex
:Seperti
dropFirst
dandropLast
sebelumnya, fungsi ini akan macet jika tidak ada cukup huruf yang tersedia di String. Tanggung jawab ada pada pemanggil untuk menggunakannya dengan benar. Ini adalah keputusan desain yang valid. Seseorang dapat menulisnya untuk mengembalikan opsional yang kemudian harus dibuka oleh pemanggil.Di Swift 1.2 , Anda harus memanggil
chopPrefix
seperti ini:atau Anda dapat menambahkan garis bawah
_
ke definisi fungsi untuk menyembunyikan nama parameter:sumber
Swift 2.2.0
Swift 3.0.0
Swift 3.2.0
Cepat 4
sumber
Di Swift 2, lakukan ini:
Saya merekomendasikan https://www.mikeash.com/pyblog/friday-qa-2015-11-06-why-is-swifts-string-api-so-hard.html untuk mendapatkan pemahaman tentang string Swift.
sumber
Tergantung pada hasil akhir yang Anda inginkan (mutasi vs nonmutasi).
Mulai Swift 4.1:
Mutasi:
Nonmutasi:
Catatan:
nonmutating
contoh untuk kejelasan. Secara subyektif, menggabungkan dua langkah terakhir akan lebih ringkas.dropFirst
tampaknya agak aneh bagi saya karena jika saya memahami Panduan Desain API Swift dengan benar,dropFirst
seharusnya benar-benar sepertidropingFirst
itu karena tidak bermutasi. Hanya pemikiran saja :).sumber
droppingFirst
- mereka mengacau!Bagaimana dengan ini?
Ini tentu saja mengasumsikan bahwa string Anda bisa berubah. Ini mengembalikan karakter yang telah dihapus, tetapi mengubah string asli.
sumber
Jawaban sebelumnya cukup bagus, tetapi untuk hari ini, saya pikir ini mungkin cara paling ringkas untuk menghapus karakter pertama dari string di Swift 4 :
sumber
Saya tahu tidak ada yang lebih ringkas, tetapi Anda dapat dengan mudah menerapkan awalan
++
, misalnya,Setelah itu Anda dapat menggunakannya sesuka hati Anda dengan sangat ringkas:
sumber
Di Swift 2 gunakan ekstensi String ini:
sumber
sumber
Untuk menghapus karakter pertama dari string
sumber
Ini adalah versi ekstensi Swift4 crash save, yang diserahkan ke komunitas ...
chopPrefix
chopSuffix
sumber
Swift3
sumber