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 NSString
memiliki length
properti. Tapi saya belum bisa menemukan yang serupa untuk SwiftString
.
Saya bertanya-tanya, untuk aplikasi iOS, apakah saya harus tetap menggunakan tipe Foundation?
String
. Namun,String
fungsionalitasnya masih agak terbatas dalam rilis alfa, jadiNSString
akan lebih banyak digunakan untuk saat ini. Kami berharap mereka akan memperbaiki API hingga GA.countElements(str)
, untuk menjawab bagian spesifik dari pertanyaan Anda."foo".length" directly in Swift. An implicit cast to
NSString` ditambahkan untuk Anda oleh kompilator!Jawaban:
Anda harus menggunakan tipe asli Swift jika memungkinkan. Bahasa dioptimalkan untuk menggunakannya, dan sebagian besar fungsionalitas dijembatani antara tipe asli dan
Foundation
tipe.Meskipun
String
danNSString
sebagian besar dapat dipertukarkan, misalnya, Anda dapat meneruskanString
variabel ke dalam metode yang mengambilNSString
parameter 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 penggunaancontainsString()
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 menggunakanbridgeToObjectiveC()
variabel / konstanta yang ada dari jenis Swift, seperti dalamstr.bridgeToObjectiveC().length
contoh. Anda juga dapat mentransmisikanString
ke sebuahNSString
dengan menggunakanstr 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
/NSString
bridge, misalnya, harus sepenuhnya mulus.Untuk pembahasan menyeluruh tentang subjek, lihat Menggunakan Swift dengan Kakao dan Objective-C: Bekerja dengan Jenis Data Kakao
sumber
bridgeToObjectiveC()
dan menjelaskan hubungan antara NSString dan Swift's String.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.
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.
Sekarang String mampu melakukan semua operasi yang dapat dilakukan siapa saja pada tipe Collection.
Untuk informasi lebih lanjut silakan lihat dokumen apple.
sumber
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
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
sumber
String
danNSString
dapat dipertukarkan, jadi tidak masalah mana yang Anda gunakan. Anda selalu dapat melakukan cast di antara keduanya, menggunakanatau bahkan
NSInteger
hanyalah sebuah alias untuk sebuahint
ataulong
(tergantung pada arsitekturnya), jadi saya akan menggunakanInt
.NSDictionary
adalah masalah yang berbeda, karenaDictionary
merupakan 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.sumber
Int
Tipe data Swift dinyatakan, dalam buku, sama dengan ukuran kata arsitektur.NSInteger
ukurannya juga sama dengan ukuran kata dari arsitektur.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
sumber
Gunakan tipe asli Swift kapan pun Anda bisa. Namun, dalam kasus String, Anda memiliki akses "tanpa hambatan" ke semua
NSString
metode seperti ini:sumber
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.
sumber
NSString
Mungkin tidak akan diperbarui untuk menangani kluster grafem: Ini akan merusak terlalu banyak aplikasi yang mengandalkan perilaku lama. Juga,NSString.length
menghitung karakter UTF16.String adalah sebuah struct
// di Swift Module
public struct String
{
}
NSString adalah sebuah kelas
// di Modul Foundation
kelas terbuka NSString: NSObject
{
}
sumber