Bagaimana saya bisa mendapatkan karakter n dari string? Saya mencoba braket ( []
) accessor tanpa hasil.
var string = "Hello, world!"
var firstChar = string[0] // Throws error
GALAT: 'subskrip' tidak tersedia: tidak dapat subskrip dengan String dengan Int, lihat komentar dokumentasi untuk diskusi
swift
string
collections
character
Mohsen
sumber
sumber
var firstChar = string.index(string.startIndex, offsetBy: 0)
sebagai gantinyastring.startIndex
? Untuk karakter pertamastring[string.startIndex]
atau sederhananyastring.first
. Perhatikan bahwa pendekatan pertama yang perlu Anda periksa apakah string kosong pertama yang kedua mengembalikan opsionalJawaban:
Perhatian: Silakan lihat jawaban Leo Dabus untuk implementasi yang tepat untuk Swift 4 dan Swift 5.
Cepat 4 atau lebih baru
Itu
Substring
jenis diperkenalkan di Swift 4 untuk membuat substring lebih cepat dan lebih efisien dengan berbagi penyimpanan dengan string asli, sehingga ini apa fungsi subscript harus kembali.Cobalah di sini
Untuk mengonversikannya
Substring
menjadiString
, Anda cukup melakukannyaString(string[0..2])
, tetapi Anda hanya harus melakukannya jika Anda berencana untuk menjaga agar substring tetap ada. Kalau tidak, akan lebih efisien jika menyimpannyaSubstring
.Alangkah baiknya jika seseorang dapat menemukan cara yang baik untuk menggabungkan dua ekstensi ini menjadi satu. Saya mencoba memperluasCatatan: Jawaban ini sudah diedit, sudah diterapkan dengan benar dan sekarang berfungsi untuk substring juga. Pastikan untuk menggunakan rentang yang valid untuk menghindari tabrakan saat berlangganan jenis StringProtocol Anda. Untuk berlangganan dengan rentang yang tidak akan macet dengan nilai di luar rentang, Anda dapat menggunakan implementasi iniStringProtocol
tanpa keberhasilan, karenaindex
metode itu tidak ada di sana.Mengapa ini bukan bawaan?
Pesan kesalahan mengatakan "lihat komentar dokumentasi untuk diskusi" . Apple memberikan penjelasan berikut dalam file UnavailableStringAPIs.swift :
sumber
Cannot find an overload for 'advance' that accepts an argument list of type '(String.Index, T)'
...String.Index
danInt
tidak kompatibel.Cannot subscript a value of type 'String'...
periksa jawaban ini: stackoverflow.com/a/31265316/649379Ambiguous use of 'subscript'
.fatal error: Can't form a Character from an empty String
Cepat 5.2
Anda perlu menambahkan ekstensi String ini ke proyek Anda (ini sepenuhnya diuji):
Meskipun Swift selalu memiliki solusi untuk masalah ini (tanpa ekstensi String, yang saya berikan di bawah), saya tetap akan melakukannya sangat menyarankan menggunakan ekstensi. Mengapa? Karena itu menyelamatkan saya dari puluhan jam migrasi yang menyakitkan dari versi awal Swift, di mana sintaksis String mengubah hampir setiap rilis, tetapi yang perlu saya lakukan adalah memperbarui implementasi ekstensi sebagai lawan refactoring seluruh proyek. Tentukan pilihanmu.
sumber
range.upperBound - range.lowerBound
kerange.count
extension StringProtocol where Self: RangeReplaceableCollection { subscript(offset: Int) -> Element { get { return self[index(startIndex, offsetBy: offset)] } set { let start = index(startIndex, offsetBy: offset) replaceSubrange(start..<index(after: start), with: [newValue]) } } }
Saya baru saja menemukan solusi yang rapi ini
sumber
var firstChar = Array(string!)[0]
Kalau tidak akan dikatakanadd arrayLiteral
Tidak ada pengindeksan menggunakan bilangan bulat, hanya menggunakan
String.Index
. Sebagian besar dengan kompleksitas linier. Anda juga dapat membuat rentang dariString.Index
dan menggunakan substring.Swift 3.0
Swift 2.x
Perhatikan bahwa Anda tidak dapat menggunakan indeks (atau rentang) yang dibuat dari satu string ke string lain
sumber
String
indeks unik untuk sebuah string. Ini karena string yang berbeda mungkin memiliki UTF-16 multi-unit yang berbedaCharacters
dan / atau pada posisi yang berbeda sehingga indeks unit UTF-16 tidak akan cocok, dapat melampaui batas atau titik di dalam UTF-16 multi-unitCharacter
...
sekarang..<
(dalam tugas Anda untukrange
)var lastChar = string[string.endIndex.predecessor()]
Xcode 11 β’ Swift 5.1
Anda dapat memperluas StringProtocol untuk membuat subskrip juga tersedia untuk substring:
Pengujian
sumber
return String(Array(characters)[range])
di Swift 3?Cepat 4
String pada indeks
Substring
Pertama dan karakter
Terakhir n karakter
Swift 2 dan 3
** String Pada Indeks **
Cepat 2
Cepat 3
SubString dariIndex keIndex
Cepat 2
Cepat 3
Pertama dan karakter
Terakhir n karakter
sumber
Swift 2.0 pada Xcode 7 GM Seed
Untuk karakter ke-n, ganti 0 dengan n-1.
Edit: Swift 3.0
nb ada cara-cara sederhana untuk meraih karakter tertentu dalam string
misalnya
let firstChar = text.characters.first
sumber
Jika Anda melihat
Cannot subscript a value of type 'String'...
menggunakan ekstensi ini:Cepat 3
Cepat 2.3
Sumber: http://oleb.net/blog/2014/07/swift-strings/
sumber
Solusi Swift 2.2:
Ekstensi berikut berfungsi di Xcode 7, ini adalah kombinasi dari solusi ini dan konversi sintaks Swift 2.0.
sumber
Kelas string cepat tidak memberikan kemampuan untuk mendapatkan karakter pada indeks tertentu karena dukungan asli untuk karakter UTF. Panjang variabel karakter UTF dalam memori membuat melompat langsung ke karakter tidak mungkin. Itu berarti Anda harus secara manual mengulangi string setiap kali.
Anda dapat memperluas String untuk menyediakan metode yang akan berulang melalui karakter sampai indeks yang Anda inginkan
sumber
myString.bridgeToObjectiveC().characterAtIndex(0)
atau(string as NSString ).characterAtIndex(0)
mengembalikan nilai Int karakterNSString
metode untuk mengakses karakter individu dari Swift-asliString
- keduanya menggunakan mekanisme penghitungan yang berbeda, sehingga Anda akan mendapatkan hasil yang tidak dapat diprediksi dengan karakter Unicode yang lebih tinggi. Metode pertama harus aman (setelah bug Unicode Swift ditangani).Sebagai catatan tambahan, ada beberapa fungsi yang dapat diterapkan langsung ke representasi rantai karakter String, seperti ini:
Hasilnya bertipe Character, tetapi Anda bisa melemparkannya ke String.
Atau ini:
:-)
sumber
Cepat 4
Ini mungkin cara terbaik untuk menyelesaikan masalah ini satu kali. Anda mungkin ingin melemparkan String sebagai array terlebih dahulu, dan kemudian melemparkan hasilnya sebagai String lagi. Jika tidak, Karakter akan dikembalikan sebagai ganti String.
Contoh
String(Array("HelloThere")[1])
akan mengembalikan "e" sebagai String.(Array("HelloThere")[1]
akan mengembalikan "e" sebagai Karakter.Swift tidak memungkinkan Strings diindeks seperti array, tetapi ini menyelesaikan pekerjaan dengan gaya kasar.
sumber
Solusi saya yang sangat sederhana:
Swift 4.1:
Swift 5.1:
sumber
let flags = "πΊπΈπ§π·"
flags[String.Index(utf16Offset: 4, in: flags)] // "π§π·"
Anda dapat melakukannya dengan mengonversi String ke Array dan mendapatkannya dengan indeks spesifik menggunakan subskrip seperti di bawah ini
sumber
Saya baru saja mengalami masalah yang sama. Cukup lakukan ini:
sumber
NSString
.Swift3
Anda dapat menggunakan sintaksis subskrip untuk mengakses Karakter pada indeks String tertentu.
Mengunjungi https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html
atau kita bisa melakukan String Extension di Swift 4
PEMAKAIAN:
sumber
Solusi saya ada dalam satu baris, seandainya cadena adalah string dan 4 adalah posisi ke-9 yang Anda inginkan:
Sederhana ... Saya kira Swift akan memasukkan lebih banyak hal tentang substring di versi mendatang.
sumber
var charAtIndex = string[advance(string.startIndex, 10)]
jawaban Sulthan?Swift 3: solusi lain (diuji di taman bermain)
Pemakaian:
sumber
Perbarui untuk subString cepat 2.0
sumber
Saya pikir jawaban cepat untuk mendapatkan karakter pertama adalah:
Ini jauh lebih elegan dan kinerja daripada:
Tapi .. jika Anda ingin memanipulasi dan melakukan lebih banyak operasi dengan string, Anda dapat berpikir membuat ekstensi .. ada satu ekstensi dengan pendekatan ini, itu sangat mirip dengan yang sudah diposting di sini:
}
TAPI ITU GAGASAN YANG MENGERIKAN !!
Ekstensi di bawah ini sangat tidak efisien. Setiap kali string diakses dengan integer, fungsi O (n) untuk memajukan indeks awal dijalankan. Menjalankan loop linier di dalam loop linier lain berarti ini untuk loop secara tidak sengaja O (n2) - karena panjang string meningkat, waktu yang dibutuhkan loop ini meningkat secara kuadratik.
Alih-alih melakukan itu Anda bisa menggunakan koleksi string karakter.
sumber
Cepat 3
Pemakaian
Tips dan Trik Pemrograman yang Membantu (ditulis oleh saya)
sumber
Dapatkan & Atur Langganan (String & Substring) - Swift 4.2
Swift 4.2, Xcode 10
Saya mendasarkan jawaban saya dari jawaban @alecarlson . Satu-satunya perbedaan besar adalah Anda bisa mendapatkan
Substring
atauString
mengembalikan (dan dalam beberapa kasus, satuCharacter
). Anda juga bisaget
danset
subskrip. Terakhir, milik saya sedikit lebih rumit dan lebih panjang dari jawaban @alecarlson dan karena itu, saya sarankan Anda memasukkannya ke file sumber.Perpanjangan:
sumber
Cepat 4.2
Jawaban ini sangat ideal karena meluas
String
dan semuaSubsequences
(Substring
) dalam satu ekstensiPemakaian
sumber
start
danend
) daristartIndex
. Anda cukup mengimbangiend
indeks menggunakan range.count dan mengimbangistart
indeksSekarang, subskrip (_ :) tidak tersedia. Kita juga tidak bisa melakukan ini
dengan string. Kita harus menyediakan "String.Index" Tapi, bagaimana kita bisa memberikan nomor indeks kita sendiri dengan cara ini, sebagai gantinya kita bisa menggunakan,
sumber
string[string.startIndex]
? BTW, kode tidak akan berperilaku / kompilasi dengan benar, karena Anda menggunakan dua nama variabel yang berbeda.Swift 4.2 atau lebih baru
Range dan subscripting berbagai parsial menggunakan
String
'sindices
propertiSebagai variasi dari jawaban bagus @LeoDabus , kami dapat menambahkan ekstensi tambahan
DefaultIndices
dengan tujuan memungkinkan kami untuk kembali keindices
propertiString
ketika menerapkan subskrip khusus (denganInt
rentang khusus dan rentang parsial) untuk yang terakhir.Terima kasih @LeoDabus karena menunjukkan saya ke arah penggunaan
indices
properti sebagai alternatif (lain) untukString
berlangganan!sumber
swiftenv
ketika saya lakukan, saya kira itu akan diperbarui dengan 4.2 juga agak segera.Swift 5.1.3:
Tambahkan ekstensi String:
sumber
String
Jenis Swift tidak menyediakancharacterAtIndex
metode karena ada beberapa cara string Unicode dapat dikodekan. Apakah Anda menggunakan UTF8, UTF16, atau yang lainnya?Anda dapat mengakses
CodeUnit
koleksi dengan mengambilString.utf8
danString.utf16
properti. Anda juga dapat mengaksesUnicodeScalar
koleksi dengan mengambilString.unicodeScalars
properti.Dalam semangat
NSString
implementasi, saya mengembalikan sebuahunichar
tipe.sumber
Untuk memberi makan subjek dan menunjukkan kemungkinan subskrip cepat, berikut ini adalah string subskrip "substring-toolbox"
Metode ini aman dan tidak pernah melewati indeks string
sumber
Solusi mirip python, yang memungkinkan Anda menggunakan indeks negatif,
bisa jadi:
Ngomong-ngomong, mungkin layak untuk mengubah notasi irisan seluruh python
sumber
Anda juga dapat mengonversi String ke Array of Characters seperti itu:
Ini adalah cara untuk mendapatkan char pada indeks yang ditentukan dalam waktu yang konstan.
Contoh di bawah ini tidak berjalan dalam waktu konstan, tetapi membutuhkan waktu linier. Jadi, jika Anda memiliki banyak pencarian di String oleh indeks, gunakan metode di atas.
sumber