Semua contoh berikut digunakan
var str = "Hello, playground"
Cepat 4
String mendapat perbaikan yang cukup besar di Swift 4. Ketika Anda mendapatkan beberapa substring dari sebuah String sekarang, Anda mendapatkan Substring
jenis kembali daripada a String
. Kenapa ini? String adalah tipe nilai dalam Swift. Itu berarti jika Anda menggunakan satu String untuk membuat yang baru, maka itu harus disalin. Ini bagus untuk stabilitas (tidak ada orang lain yang akan mengubahnya tanpa sepengetahuan Anda) tetapi buruk untuk efisiensi.
Substring, di sisi lain, adalah referensi kembali ke String asli dari mana asalnya. Berikut adalah gambar dari dokumentasi yang menggambarkan hal itu.
Tidak perlu menyalin sehingga jauh lebih efisien untuk digunakan. Namun, bayangkan Anda mendapat Substring sepuluh karakter dari String satu juta karakter. Karena Substring mereferensikan String, sistem harus berpegangan pada seluruh String selama Substring ada. Jadi, setiap kali Anda selesai memanipulasi Substring Anda, konversikan ke String.
let myString = String(mySubstring)
Ini akan menyalin hanya substring dan memori yang memegang String lama dapat direklamasi . Substring (sebagai tipe) dimaksudkan untuk berumur pendek.
Peningkatan besar lainnya di Swift 4 adalah bahwa Strings adalah Collections (lagi). Itu berarti bahwa apa pun yang dapat Anda lakukan untuk Koleksi, Anda dapat lakukan ke String (gunakan subskrip, beralih ke karakter, filter, dll).
Contoh berikut menunjukkan cara mendapatkan substring di Swift.
Mendapatkan substring
Anda bisa mendapatkan substring dari string dengan menggunakan subscript atau beberapa metode lainnya (misalnya, prefix
, suffix
, split
). Anda masih perlu menggunakan String.Index
dan bukan Int
indeks untuk rentang tersebut. (Lihat jawaban saya yang lain jika Anda membutuhkan bantuan.)
Awal dari sebuah string
Anda dapat menggunakan subskrip (perhatikan kisaran satu sisi Swift 4):
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str[..<index] // Hello
atau prefix
:
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str.prefix(upTo: index) // Hello
atau bahkan lebih mudah:
let mySubstring = str.prefix(5) // Hello
Akhir dari sebuah string
Menggunakan subskrip:
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str[index...] // playground
atau suffix
:
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str.suffix(from: index) // playground
atau bahkan lebih mudah:
let mySubstring = str.suffix(10) // playground
Perhatikan bahwa saat menggunakan suffix(from: index)
saya harus menghitung kembali dari akhir dengan menggunakan -10
. Itu tidak perlu ketika hanya menggunakan suffix(x)
, yang hanya mengambil x
karakter terakhir dari sebuah String.
Kisaran dalam sebuah string
Sekali lagi kami cukup menggunakan subskrip di sini.
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -6)
let range = start..<end
let mySubstring = str[range] // play
Konversi Substring
keString
Jangan lupa, saat Anda siap untuk menyimpan substring, Anda harus mengonversinya menjadi a String
sehingga memori string lama dapat dibersihkan.
let myString = String(mySubstring)
Menggunakan Int
ekstensi indeks?
Saya ragu untuk menggunakan Int
ekstensi indeks berdasarkan setelah membaca artikel Strings in Swift 3 oleh Airspeed Velocity dan Ole Begemann. Meskipun dalam Swift 4, Strings adalah koleksi, tim Swift sengaja tidak menggunakan Int
indeks. Masih String.Index
. Ini ada hubungannya dengan Karakter Swift yang terdiri dari berbagai jumlah titik kode Unicode. Indeks aktual harus dihitung secara unik untuk setiap string.
Saya harus mengatakan, saya harap tim Swift menemukan cara untuk abstrak String.Index
di masa depan. Tetapi sampai mereka saya memilih untuk menggunakan API mereka. Ini membantu saya untuk mengingat bahwa manipulasi String bukan hanya Int
pencarian indeks sederhana .