Swift - tipe apa yang digunakan? NSString atau String

109

Dengan diperkenalkannya Swift, saya telah mencoba memahami bahasa baru

Saya seorang pengembang iOS dan akan menggunakan jenis seperti NSString, NSInteger, NSDictionary dalam aplikasi. Saya perhatikan bahwa dalam ebook "Bahasa Pemrograman Swift" oleh Apple, mereka menggunakan jenis SwiftString, Int, Dictionary

Saya perhatikan tipe Swift tidak memiliki (atau diberi nama berbeda) beberapa fungsi yang dilakukan tipe Foundation. Misalnya NSStringmemiliki lengthproperti. Tapi saya belum bisa menemukan yang serupa untuk SwiftString .

Saya bertanya-tanya, untuk aplikasi iOS, apakah saya harus tetap menggunakan tipe Foundation?

Alec
sumber
3
Lebih suka String. Namun, Stringfungsionalitasnya masih agak terbatas dalam rilis alfa, jadi NSStringakan lebih banyak digunakan untuk saat ini. Kami berharap mereka akan memperbaiki API hingga GA.
Sulthan
1
Juga, Anda dapat menelepon countElements(str), untuk menjawab bagian spesifik dari pertanyaan Anda.
Nate Cook
Lebih baik, Anda dapat memanggil "foo".length" directly in Swift. An implicit cast to NSString` ditambahkan untuk Anda oleh kompilator!
Gabriele Petronella
1
@GabrielePetronella .length mungkin tidak berfungsi dengan benar untuk karakter khusus. Seperti Emoji atau karakter Cina yang menggunakan 2 atau 3 karakter unicode. countElements adalah metode yang benar untuk digunakan.
Fogmeister

Jawaban:

98

Anda harus menggunakan tipe asli Swift jika memungkinkan. Bahasa dioptimalkan untuk menggunakannya, dan sebagian besar fungsionalitas dijembatani antara tipe asli dan Foundationtipe.

Meskipun Stringdan NSStringsebagian besar dapat dipertukarkan, misalnya, Anda dapat meneruskan Stringvariabel ke dalam metode yang mengambil NSStringparameter dan sebaliknya, beberapa metode tampaknya tidak otomatis dijembatani pada saat ini. Lihat jawaban ini untuk diskusi tentang cara mendapatkan panjang String dan jawaban ini untuk diskusi tentang penggunaan containsString()untuk memeriksa substring. (Penafian: Saya penulis untuk kedua jawaban ini)

Saya belum sepenuhnya menjelajahi tipe data lain, tetapi saya berasumsi beberapa versi dari apa yang disebutkan di atas juga akan berlaku untuk Array/ NSArray, Dictionary/ NSDictionary, dan berbagai tipe angka di Swift danNSNumber

Kapan pun Anda perlu menggunakan salah satu jenis Foundation, Anda dapat menggunakannya untuk mengetik variabel / konstanta secara eksplisit, seperti dalam var str: NSString = "An NSString"atau menggunakan bridgeToObjectiveC()variabel / konstanta yang ada dari jenis Swift, seperti dalam str.bridgeToObjectiveC().lengthcontoh. Anda juga dapat mentransmisikan Stringke sebuah NSStringdengan menggunakan str as NSString.

Namun, keharusan untuk teknik ini untuk secara eksplisit menggunakan jenis Foundation, atau setidaknya beberapa di antaranya, mungkin akan usang di masa mendatang, karena dari apa yang dinyatakan dalam referensi bahasa, String/ NSStringbridge, misalnya, harus sepenuhnya mulus.

Untuk pembahasan menyeluruh tentang subjek, lihat Menggunakan Swift dengan Kakao dan Objective-C: Bekerja dengan Jenis Data Kakao

Cezar
sumber
4
+1 untuk referensi bridgeToObjectiveC()dan menjelaskan hubungan antara NSString dan Swift's String.
Chris
2
hey cezar, saya pikir bridgeToObjectiveC sudah usang jika Anda ingin memperbarui jawaban Anda.
Dan Beaulieu
Saya perhatikan di manual Swift 3 bahwa tipe Foundation diteruskan oleh referensi, sedangkan tipe native diteruskan oleh nilai (atau sesuatu seperti yang saya tidak sepenuhnya mengerti pada saat ini). Akan sangat bagus jika Anda dapat memperbarui jawaban Anda dengan membahas implikasinya.
Nigel B. Peck
27

NSString: Membuat objek yang berada di heap dan selalu diteruskan oleh referensi.

String: Ini adalah tipe nilai setiap kali kita melewatinya, nilai yang diteruskan. seperti Struct dan Enum, String itu sendiri merupakan Struct in Swift.

public struct String {
 // string implementation 
}

Tapi salinan tidak dibuat saat Anda lulus. Ini membuat salinan saat Anda pertama kali memutasinya.

String secara otomatis dihubungkan ke Objective-C sebagai NSString. Jika Perpustakaan Standar Swift tidak memilikinya, Anda perlu mengimpor kerangka kerja Foundation untuk mendapatkan akses ke metode yang ditentukan oleh NSString.

Swift String sangat kuat karena memiliki banyak fungsi bawaan.

Inisialisasi pada String:

var emptyString = ""             // Empty (Mutable)
let anotherString = String()     // empty String immutable    
let a = String(false)           // from boolean: "false"
let d = String(5.999)           //  "    Double "5.99"
let e = String(555)             //  "     Int "555"
// New in Swift 4.2 
let hexString = String(278, radix: 18, uppercase: true) // "F8"

buat String dari nilai berulang:

 let repeatingString = String(repeating:"123", count:2) // "123123"

Di Swift 4 -> String Adalah Koleksi Karakter:

Sekarang String mampu melakukan semua operasi yang dapat dilakukan siapa saja pada tipe Collection.

Untuk informasi lebih lanjut silakan lihat dokumen apple.

Sandy Rawat
sumber
2
Jawaban ini harus mendapatkan lebih banyak suara. Inilah perbedaan mendasar antara String dan NSString. Di mana-mana mereka hampir dapat dipertukarkan
Max
Jawaban yang bagus. nilai vs jenis ref catatan terutama.
spnkr
11

Taruhan terbaik Anda adalah menggunakan jenis dan kelas asli Swift, karena beberapa orang lain telah mencatat NSString memiliki terjemahan bebas pulsa ke String, namun, mereka tidak sama 100%, ambil contoh yang berikut ini

var nsstring: NSString = "\U0001F496"
var string: String = "\U0001F496"

nsstring.length
count(string)

Anda perlu menggunakan metode count () untuk menghitung karakter dalam string, perhatikan juga bahwa nsstring.length mengembalikan 2, karena menghitung panjangnya berdasarkan UTF16.

Serupa, YA sama, TIDAK

Emanuel
sumber
7

Stringdan NSStringdapat dipertukarkan, jadi tidak masalah mana yang Anda gunakan. Anda selalu dapat melakukan cast di antara keduanya, menggunakan

let s = "hello" as NSString

atau bahkan

let s: NSString  = "hello"

NSIntegerhanyalah sebuah alias untuk sebuah intatau long(tergantung pada arsitekturnya), jadi saya akan menggunakan Int.

NSDictionaryadalah masalah yang berbeda, karena Dictionarymerupakan implementasi yang sepenuhnya terpisah.

Secara umum saya akan tetap menggunakan tipe swift kapan pun memungkinkan dan Anda selalu dapat mengonversi di antara keduanya saat dibutuhkan, menggunakan bridgeToObjectiveC()metode yang disediakan oleh kelas swift.

Gabriele Petronella
sumber
IntTipe data Swift dinyatakan, dalam buku, sama dengan ukuran kata arsitektur. NSIntegerukurannya juga sama dengan ukuran kata dari arsitektur.
MaddTheSane
6

Karena tipe C objektif masih dikirim secara dinamis, mereka mungkin akan lebih lambat. Saya akan mengatakan Anda paling baik dilayani menggunakan tipe asli Swift kecuali Anda perlu berinteraksi dengan API objektif-c

Jiaaro
sumber
Ya, itulah jawabannya. Dan menghindari metode yang dikirim secara dinamis dan akses variabel objek adalah semua yang membuat peningkatan kecepatan yang mereka bicarakan di WWDC. Di masa lalu, semua orang yang khawatir tentang performa menggunakan string dan container C ++ untuk mendapatkan pengiriman statis.
Lothar
5

Gunakan tipe asli Swift kapan pun Anda bisa. Namun, dalam kasus String, Anda memiliki akses "tanpa hambatan" ke semua NSStringmetode seperti ini:

var greeting = "Hello!"
var len = (greeting as NSString).length
Nate Cook
sumber
4

Pembaruan Swift 4

String mendapat revisi dengan cepat 4. Sekarang Anda dapat langsung memanggil count di atasnya dan menganggap cluster grafem sebagai 1 bagian, seperti emoji. NSString tidak diperbarui dan menghitungnya dengan cara lain.

var nsstring: NSString = "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ"
var string: String = "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ"

print(nsstring.length) // 11
print(string.count)    // 1
Fangming
sumber
1
NSStringMungkin tidak akan diperbarui untuk menangani kluster grafem: Ini akan merusak terlalu banyak aplikasi yang mengandalkan perilaku lama. Juga, NSString.lengthmenghitung karakter UTF16.
MaddTheSane
0

String adalah sebuah struct

// di Swift Module

public struct String

{

}

NSString adalah sebuah kelas

// di Modul Foundation

kelas terbuka NSString: NSObject

{

}

kashish makkar
sumber