Sudah waktunya untuk mengakui kekalahan ...
Di Objective-C, saya bisa menggunakan sesuatu seperti:
NSString* str = @"abcdefghi";
[str rangeOfString:@"c"].location; // 2
Di Swift, saya melihat sesuatu yang serupa:
var str = "abcdefghi"
str.rangeOfString("c").startIndex
... tapi itu hanya memberi saya String.Index
, yang bisa saya gunakan untuk berlangganan kembali ke string asli, tetapi tidak mengambil lokasi dari.
FWIW, yang String.Index
memiliki ivar pribadi yang disebut _position
memiliki nilai yang benar di dalamnya. Aku hanya tidak melihat bagaimana itu terlihat.
Saya tahu saya bisa dengan mudah menambahkan ini ke String sendiri. Saya lebih ingin tahu tentang apa yang saya lewatkan di API baru ini.
Jawaban:
Anda bukan satu-satunya yang tidak dapat menemukan solusinya.
String
tidak menerapkanRandomAccessIndexType
. Mungkin karena mereka mengaktifkan karakter dengan panjang byte yang berbeda. Itu sebabnya kita harus menggunakanstring.characters.count
(count
ataucountElements
dalam Swift 1.x) untuk mendapatkan jumlah karakter. Itu juga berlaku untuk posisi. The_position
mungkin indeks ke dalam array mentah byte dan mereka tidak ingin mengekspos itu. IniString.Index
dimaksudkan untuk melindungi kita dari mengakses byte di tengah karakter.Itu berarti bahwa indeks apa pun yang Anda dapatkan harus dibuat dari
String.startIndex
atauString.endIndex
(String.Index
mengimplementasikanBidirectionalIndexType
). Indeks lainnya dapat dibuat menggunakansuccessor
ataupredecessor
metode.Sekarang untuk membantu kami dengan indeks, ada satu set metode (fungsi di Swift 1.x):
Swift 4.x
Swift 3.0
Swift 2.x
Swift 1.x
Bekerja dengan
String.Index
itu rumit tetapi menggunakan pembungkus untuk mengindeks oleh bilangan bulat (lihat https://stackoverflow.com/a/25152652/669586 ) berbahaya karena menyembunyikan inefisiensi pengindeksan nyata.Perhatikan bahwa implementasi pengindeksan Swift memiliki masalah yang indeks / rentang yang dibuat untuk satu string tidak dapat diandalkan digunakan untuk string yang berbeda , misalnya:
Swift 2.x
Swift 1.x
sumber
range
divar range = text.rangeOfString("b")
Collection
memilikitypealias IndexType
. Untuk array, didefinisikan sebagaiInt
, untukString
didefinisikan sebagaiString.Index
. Baik array dan string juga dapat menggunakan rentang (untuk membuat subarrays dan substring). Rentang ini merupakan tipe khususRange<T>
. Untuk string, iniRange<String.Index>
, untuk arrayRange<Int>
.Swift 2.0
,distance(text.startIndex, range.startIndex)
menjaditext.startIndex.distanceTo(range.startIndex)
String
, persis sepertiNSString
di Yayasan memiliki metode yang disebuthasPrefix(_:)
.Swift 3.0 membuat ini lebih verbose:
Perpanjangan:
Di Swift 2.0 ini menjadi lebih mudah:
Perpanjangan:
Implementasi Swift 1.x:
Untuk solusi Swift murni, seseorang dapat menggunakan:
Sebagai perpanjangan ke
String
:sumber
sumber
Saya telah menemukan solusi ini untuk swift2:
sumber
Swift 5.0
Cepat 4.0
sumber
Saya tidak yakin bagaimana cara mengekstrak posisi dari String.Index, tetapi jika Anda bersedia untuk kembali ke beberapa kerangka kerja Objective-C, Anda dapat menjembatani ke tujuan-c dan melakukannya dengan cara yang sama seperti dulu.
Sepertinya beberapa metode NSString belum (atau mungkin tidak) porting ke String. Berisi juga muncul di pikiran.
sumber
bridgeToObjectiveC()
panggilan tidak diperlukan. Masalah saya tampaknya hanya muncul ketika memanggilrangeOfString
Swift String yang sudah ada sebelumnya. Sepertinya masalah API ...Berikut ini adalah ekstensi String bersih yang menjawab pertanyaan:
Swift 3:
Swift 2.2:
sumber
Anda juga dapat menemukan indeks karakter dalam string tunggal seperti ini,
Yang memberikan hasil dalam [String.Distance] yaitu. [Int], seperti
sumber
Jika Anda ingin menggunakan NSString yang sudah dikenal, Anda dapat mendeklarasikannya secara eksplisit:
Saya belum yakin bagaimana melakukan ini di Swift.
sumber
Jika Anda ingin mengetahui posisi dari karakter di string sebagai int penggunaan nilai ini:
sumber
value of type 'Range<String.Index>?' has no member 'location'
.Saya tahu ini sudah lama dan jawaban telah diterima, tetapi Anda dapat menemukan indeks string dalam beberapa baris kode menggunakan:
Beberapa informasi hebat lainnya tentang string Swift di sini Strings in Swift
sumber
find
tidak tersedia di Swift 3Ini berhasil untuk saya,
ini bekerja juga,
sumber
var str = "abcdef"; str.rangeOfString("c").location
memunculkan kesalahan tentang String.Index tidak memiliki lokasi bernama anggota ...Tipe variabel String di Swift berisi fungsi yang berbeda dibandingkan dengan NSString di Objective-C. Dan seperti yang disebutkan Sulthan,
Apa yang dapat Anda lakukan adalah menurunkan variabel Anda dari tipe String ke NSString (ini berlaku di Swift). Ini akan memberi Anda akses ke fungsi di NSString.
sumber
Jika Anda memikirkannya, Anda sebenarnya tidak benar-benar membutuhkan versi Int lokasi yang tepat. Rentang atau bahkan String .Index cukup untuk mendapatkan substring lagi jika diperlukan:
sumber
Cara paling sederhana adalah:
Dalam Swift 3 :
sumber
String adalah tipe jembatan untuk NSString, jadi tambahkan
ke file cepat Anda dan gunakan semua metode "lama".
sumber
Dalam hal berpikir ini mungkin disebut INVESTASI. Anda menemukan bahwa dunia itu bulat, bukan datar. "Kamu tidak benar-benar perlu tahu INDEKS karakter untuk melakukan sesuatu dengannya." Dan sebagai seorang programmer C saya merasa sulit untuk mengambil juga! Baris Anda "biarkan indeks = letters.characters.indexOf (" c ")!" sudah cukup dengan sendirinya. Misalnya untuk menghapus huruf c yang bisa Anda gunakan ...
Namun, jika Anda menginginkan indeks, Anda perlu mengembalikan INDEX yang sebenarnya bukan Int karena nilai Int akan memerlukan langkah-langkah tambahan untuk penggunaan praktis apa pun. Ekstensi ini mengembalikan indeks, hitungan karakter tertentu, dan rentang yang akan ditunjukkan oleh kode plug-in-bermain ini.
sumber
Solusi Lengkap Swift 4:
OffsetIndexableCollection (String menggunakan Int Index)
https://github.com/frogcjn/OffsetIndexableCollection-String-Int-Indexable-
sumber
ekstensi String {
}
sumber
Cepat 5
Temukan indeks substring
Temukan indeks Karakter
sumber
Jika Anda mencari cara mudah untuk mendapatkan indeks Character atau String checkout perpustakaan ini http://www.dollarswift.org/#indexof-char-character-int
Anda bisa mendapatkan indexOf dari string menggunakan string lain juga atau pola regex
sumber
Untuk mendapatkan indeks substring dalam string dengan Swift 2:
sumber
Dalam cepat 2.0
sumber
sumber
Saya bermain dengan mengikuti
sampai saya mengerti yang disediakan sekarang hanya array Karakter
dan dengan
sumber
Jika Anda hanya memerlukan indeks karakter, solusi paling cepat dan cepat (seperti yang telah ditunjukkan oleh Pascal) adalah:
sumber
Tentang subjek mengubah a
String.Index
menjadiInt
, ekstensi ini berfungsi untuk saya:Contoh penggunaan yang relevan dengan pertanyaan ini:
Penting:
Seperti yang Anda tahu, itu mengelompokkan cluster grapheme diperpanjang dan bergabung karakter berbeda dari
String.Index
. Tentu saja, ini sebabnya kami punyaString.Index
. Anda harus ingat bahwa metode ini menganggap cluster sebagai karakter tunggal, yang lebih dekat untuk dikoreksi. Jika tujuan Anda adalah untuk membagi string dengan Unicode codepoint, ini bukan solusi untuk Anda.sumber
Di Swift 2.0 , fungsi berikut mengembalikan substring sebelum karakter yang diberikan.
sumber
Anda dapat menemukan nomor indeks karakter dalam string dengan ini:
sumber
Sebagai perspektif saya, Cara yang lebih baik dengan mengetahui logika itu sendiri ada di bawah
sumber