Indonesian (Bahasa Indonesia) translation by Sap (you can also view the original English article)
Kerangka Foundation adalah roti dan mentega di toolbox dari pengembang iOS. Ini menyediakan kelas root NSObject
dan sejumlah besar blok bangunan fundamental untuk pengembangan iOS, dari kelas untuk angka dan string, hingga array dan kamus. Kerangka Foundation mungkin tampak agak membosankan pada awalnya, tetapi itu memanfaatkan banyak kekuatan dan sangat diperlukan saat mengembangkan aplikasi iOS.
Sebuah Kata Tentang Yayasan Inti
Dalam artikel sebelumnya, saya secara singkat menyebutkan Core Foundation dan hubungannya dengan Foundation. Meskipun kita tidak akan secara eksplisit menggunakan kerangka Core Foundation di sisa seri ini, itu ide yang baik untuk menjadi akrab dengannya dan untuk mengetahui bagaimana hal itu berbeda dari kerangka Foundation, yang akan Anda gunakan secara ekstensif.
Sementara kerangka Foundation diimplementasikan dalam Objective-C, kerangka Core Foundation didasarkan pada bahasa C. Meskipun ada perbedaan ini, kerangka Core Foundation tidak menerapkan model objek terbatas. Model objek ini memungkinkan definisi koleksi jenis buram yang sering disebut sebagai objek—terlepas dari fakta bahwa mereka, secara tegas, bukan objek.
Tujuan utama dari kedua kerangka kerja ini serupa, memungkinkan pembagian data dan kode antara berbagai pustaka dan kerangka kerja. Core Foundation juga termasuk dukungan untuk internasionalisasi. Komponen kunci dari dukungan ini disediakan melalui tipe opak CFString
, yang secara efisien mengelola array karakter Unicode.
Seperti yang saya sebutkan sebelumnya, jembatan bebas-bebas secara harfiah menjembatani kesenjangan antara kedua kerangka kerja dengan memungkinkan substitusi objek Cocoa untuk objek Core Foundation dalam parameter fungsi dan sebaliknya.
Penting untuk dicatat bahwa Automatic Reference Counting (ARC) tidak mengelola "objek" Core Foundation, yang berarti Anda bertanggung jawab untuk mengelola memori ketika bekerja dengan "objek" Core Foundation. Ada artikel bagus dari Mike Ash tentang Penghitungan Referensi Otomatis dan bagaimana menggunakan ARC dengan Core Foundation dan bridging bebas pulsa.
Kunjungi Perpustakaan Pengembang Mac untuk daftar lengkap dari jenis buram yang termasuk dalam kerangka Core Foundation.
Latihan, Latihan, Latihan
Mempelajari keterampilan baru paling baik dilakukan melalui praktik sehingga membuat proyek baru di Xcode dan pilih templat proyek Command Line Tool seperti yang kita lakukan sebelumnya dalam seri ini. Template Command Line Tool dapat ditemukan di kategori Application di bagian OS X. Klik Next untuk melanjutkan.



Beri nama Foundation proyek baru dan masukkan nama organisasi dan identifier perusahaan. Untuk proyek ini, adalah kunci untuk mengatur jenis proyek ke Foundation. Beri tahu Xcode tempat Anda ingin menyimpan proyek dan tekan Create.



Uji jalan
Tempat bermain kita untuk sisa artikel ini akan menjadi main.m dan jendela konsol Xcode. Buka main.m dengan memilihnya di Project Navigator di sidebar kiri dan pastikan bahwa jendela konsol terlihat dengan mengklik tombol tengah pada kontrol View di toolbar Xcode.



Klik tombol Run di kiri atas untuk membangun dan menjalankan skema saat ini. Jika semua berjalan lancar, Anda harus melihat Hello, World! muncul di jendela konsol di bagian bawah.



Kerangka Dasar
Kerangka Foundation lebih dari sekedar kumpulan kelas untuk bekerja dengan angka, string, dan koleksi (array, kamus, dan set). Ini juga mendefinisikan puluhan protokol, fungsi, tipe data, dan konstanta.
Di sisa artikel ini, saya terutama akan fokus pada kelas-kelas yang paling sering Anda gunakan ketika mengembangkan aplikasi iOS. Namun, saya juga akan secara singkat berbicara tentang tiga protokol kunci yang didefinisikan oleh kerangka Foundation, NSObject
, NSCoding
, dan NSCopying
.
File Header
Seperti yang Anda ketahui, file header kelas mendefinisikan antarmuka. Apakah itu berarti Anda harus mengimpor file header dari setiap kelas Foundation yang Anda rencanakan untuk digunakan? Jawabannya ya dan tidak.
Memang diperlukan untuk mengimpor file header dari suatu kelas sebelum Anda dapat menggunakannya. Anda melakukannya dengan menambahkan pernyataan impor seperti yang kita lihat sebelumnya dalam seri ini. Namun, kerangka Yayasan menyediakan cara mudah untuk memfasilitasi proses ini. Satu-satunya file yang perlu Anda impor adalah Foundation.h seperti yang diperlihatkan dalam cuplikan kode berikut.
#import <Foundation/Foundation.h>;
Di belakang layar, kerangka kerja Foundation mengimpor semua file header yang diperlukan untuk memberikan Anda akses ke setiap kelas, protokol, fungsi, tipe data, dan konstanta kerangka kerja Foundation.
Mengimpor
Ketika Anda membuat proyek baru di Xcode dan Anda mengatur jenis proyek ke Foundation, Xcode akan:
- hubungkan proyek dengan kerangka Foundation
- tambahkan pernyataan impor di atas ke main.m
- tambahkan pernyataan impor di atas ke file header dikompilasi proyek (*.pch)
Buka main.m untuk memverifikasi ini dan memperluas folder kerangka kerja di Project Navigator dengan mengklik segitiga kecil di sebelah kiri. Saya akan meninjau kembali file header terkompilasi dan tujuannya ketika kita melihat kerangka UIKit.
Protokol
Beberapa bahasa, seperti Perl, Python, dan C++, menyediakan dukungan untuk multiple inheritance, yang berarti kelas dapat diturunkan—menjadi subkelas—lebih dari satu kelas.
Meskipun Objective-C tidak memberikan dukungan untuk multiple inheritance, ia mendukung multiple inheritance melalui spesifikasi dalam bentuk protokol. Apa artinya ini? Alih-alih mewarisi dari kelas, protokol mendefinisikan daftar metode yang diterapkan kelas jika mereka sesuai dengan protokol.
Protokol dapat memiliki metode wajib dan opsional. Jika kelas tidak mengimplementasikan semua metode protokol yang diperlukan, kompiler akan melemparkan kesalahan.
Manfaat protokol banyak ragamnya. Ketika kelas adopts atau conforms to protokol, kelas diharapkan untuk mengimplementasikan metode (diperlukan) yang dideklarasikan dalam protokol.
Protokol Objective-C sangat mirip dengan antarmuka di Java. Ini berarti bahwa protokol dapat digunakan untuk menyatakan antarmuka ke suatu objek tanpa mengungkapkan kelas objek.
Warisan berganda memiliki manfaatnya, tetapi yang pasti memiliki kelemahannya. Keuntungan dari protokol adalah bahwa kelas yang tidak terkait masih dapat berbagi perilaku yang sama melalui penggunaan protokol.
NSObject
Selain kelas root NSObject
, framework Foundation juga mendefinisikan protokol NSObject
. Objek yang sesuai dengan protokol NSObject
dapat ditanyakan tentang kelas dan superclass mereka, dapat dibandingkan dengan objek lain, dan menanggapi self
seperti yang kita lihat dalam artikel tentang Objective-C. Ini hanya sebagian kecil dari perilaku yang ditambahkan ke objek yang sesuai dengan protokol NSObject
.
NSCoding
Objek yang sesuai dengan protokol NSCoding
dapat dikodekan dan didekodekan. Ini diperlukan untuk objek yang perlu diarsipkan atau didistribusikan. Obyek arsip terjadi ketika objek atau objek grafik disimpan ke disk, misalnya.
NSCopying
Protokol NSCopying
hanya menyatakan satu metode, copyWithZone:
. Jika kelas mendukung objek penyalinan, kelas harus sesuai dengan protokol NSCopying
. Menyalin objek dilakukan dengan mengirimkan pesan copy
atau copyWithZone:
.
NSObject
Kelas NSObject
adalah kelas akar dari sebagian besar hierarki kelas Objective-C. Apakah Anda ingat bahwa kita memulai instance dari kelas Book
sebelumnya dalam seri ini? Kita mengirim kelas Book
pesan alloc
dan kita mengirim objek yang dihasilkan pesan init
. Kedua metode dideklarasikan di kelas NSObject
.
Dengan mewarisi dari kelas akar NSObject
, objek tahu bagaimana berperilaku sebagai objek Objective-C dan bagaimana antarmuka dengan runtime Objective-C. Seharusnya tidak mengejutkan bahwa NSObject
sesuai dengan protokol NSObject
yang dilihat sebelumnya.
Hapus pernyataan NSLog
di main.m dan tempel cuplikan kode berikut di tempatnya.
NSObject *myFirstObject = [[NSObject alloc] init]; NSLog(@"Class > %@", [myFirstObject class]); NSLog(@"Superclass > %@", [myFirstObject superclass]); NSLog(@"Conforms to Protocol > %i", [myFirstObject conformsToProtocol:@protocol(NSObject)]);
Kita mulai dengan membuat instance dari NSObject
dan menyimpan referensi ke dalam variabel myFirstObject
. Di baris kedua, kita nama kelas objek baru ke konsol. Metode class
, mengembalikan instance NSString
, objek string, yang menjadi alasan kita menggunakan penentu format %@
dalam pernyataan NSLog
.
Selanjutnya, kita meminta myFirstObject
untuk superclass dan mengakhiri dengan memverifikasi bahwa myFirstObject
sesuai dengan protokol NSObject
. Apakah Anda bingung dengan @protocol(NSObject)
? Ini tidak lebih dari referensi ke protokol NSObject
.
Klik Run dan periksa output di jendela konsol. Apakah Anda terkejut dengan hasilnya? Karena NSObject
adalah kelas root, ia tidak memiliki superclass.
NSNumber
Kelas NSNumber
adalah kelas utilitas yang mengelola salah satu jenis data numerik dasar. Ini adalah subkelas dari kelas NSValue
, yang menyediakan penutup berorientasi objek untuk jenis skalar serta pointer, struktur, dan objek id. Kelas NSNumber
mendefinisikan metode untuk mengambil nilai menyimpan, untuk membandingkan nilai-nilai, dan juga untuk mengambil sebuah string representasi dari nilai tersimpan.
Perlu diingat bahwa nilai yang diambil dari instance NSNumber
perlu konsisten dengan nilai yang disimpan di dalamnya. Kelas NSNumber
akan mencoba untuk secara dinamis mengkonversi nilai yang disimpan ke tipe yang diminta, tetapi tidak perlu dikatakan bahwa ada batasan yang melekat pada tipe data yang NSNumber
dapat kelola.
Mari saya ilustrasikan ini dengan sebuah contoh. Tambahkan potongan kode berikut ke main.m.
NSNumber *myNumber = [NSNumber numberWithDouble:854736e+13]; NSLog(@"Double Value > %f", [myNumber doubleValue]); NSLog(@"Float Value > %f", [myNumber floatValue]); NSLog(@"Int Value > %i", [myNumber intValue]);
Kita mulai dengan membuat instance NSNumber
baru dengan memberikan nilai double
ke numberWithDouble:
. Selanjutnya, kita mengambil nilai yang tersimpan menggunakan tiga metode NSNumber
yang berbeda. Hasilnya tidak mencerminkan nilai yang disimpan di myNumber
karena alasan yang jelas.
Pelajarannya sederhana, konsisten ketika menggunakan NSNumber
dengan melacak jenis yang disimpan dalam instance NSNumber
.
NSString
Instance dari kelas NSString
mengelola array karakter unichar
yang membentuk string teks. Perbedaan halus tetapi penting dengan string C biasa, yang mengelola karakter char
, adalah bahwa karakter unichar
adalah karakter multibyte.
Seperti namanya, karakter unichar
sangat cocok untuk menangani karakter Unicode. Karena penerapan ini, kelas NSString
memberikan dukungan luar-dalam-kotak untuk internasionalisasi.
Saya ingin menekankan bahwa string yang dikelola oleh instance NSString
tidak dapat diubah. Ini berarti bahwa setelah string dibuat, string tidak dapat dimodifikasi. Pengembang yang berasal dari bahasa lain, seperti PHP, Ruby, atau JavaScript, mungkin bingung oleh perilaku ini.
Kerangka Foundation juga mendefinisikan subkelas yang dapat berubah dari NSString
, NSMutableString
, yang dapat dimodifikasi setelah dibuat.
Ada berbagai cara untuk membuat objek string. Cara paling sederhana untuk membuat objek string
adalah dengan memanggil metode string pada kelas NSString
, yang mengembalikan objek string kosong. Lihatlah referensi kelas NSString
untuk daftar lengkap penginisialisasi.
Jalur umum lainnya untuk membuat objek string adalah melalui literal string seperti yang ditunjukkan pada contoh di bawah ini. Dalam contoh ini, string literal ditugaskan ke variabel someString
. Pada waktu kompilasi, kompilator akan mengganti string literal dengan turunan NSString
.
NSString *string1 = @"This is a string literal.";
Kelas NSString
memiliki banyak contoh dan metode kelas untuk membuat dan memanipulasi string dan Anda akan jarang, jika pernah, merasakan kebutuhan untuk subkelas NSString
.
Mari kita jelajahi NSString
dan subkelasnya yang dapat diubah, NSMutableString
, dengan menambahkan cuplikan berikut ke main.m.
NSString *string1 = @"This is a string literal."; NSString *string2 = [[NSString alloc] initWithFormat:@"Strings can be created many ways."]; NSMutableString *mutableString = [[NSMutableString alloc] initWithString:string1]; [mutableString appendFormat:@" %@", string2]; NSLog(@"%@", mutableString);
Kita mulai dengan membuat objek string menggunakan string literal. Di baris kedua, kita membuat string kedua dengan menggunakan salah satu dari initializers khusus yang disediakan NSString
. String yang bisa berubah kemudian dibuat dengan melewatkan string pertama sebagai argumen. Untuk mengilustrasikan string yang dapat berubah dapat dimodifikasi setelah dibuat, string2
ditambahkan ke string yang dapat berubah dan masuk ke jendela konsol.
NSArray
dan NSSet
Kelas NSArray
mengelola suatu daftar objek yang tidak berubah dan teratur. Kerangka Foundation juga mendefinisikan subkelas yang dapat berubah dari NSArray
, NSMutableArray
. Kelas NSArray
berperilaku sangat mirip dengan array C dengan perbedaan bahwa turunan NSArray
mengatur objek. Selain itu, NSArray
menyatakan berbagai metode yang memfasilitasi bekerja dengan array, seperti metode untuk mencari dan menyortir objek dalam larik.
Sangat penting untuk memahami bahwa contoh NSArray
, NSSet
, dan NSDictionary
hanya dapat menyimpan objek. Ini berarti bahwa tidak mungkin menyimpan jenis skalar, pointer, atau struktur dalam kelas koleksi ini—atau subkelasnya—kompiler akan melemparkan kesalahan jika Anda melakukannya. Solusinya adalah dengan membungkus jenis skalar, pointer, dan struktur dalam sebuah instance NSValue
atau NSNumber
seperti yang kita lihat sebelumnya dalam artikel ini.
Tambahkan cuplikan kode berikut ini ke main.m untuk menjelajahi NSArray
dan mitranya yang dapat berubah, NSMutableArray
.
NSArray *myArray = [NSArray arrayWithObjects:@"Bread", @"Butter", @"Milk", @"Eggs", nil]; NSLog(@"Number of Elements > %li", [myArray count]); NSLog(@"Object at Index 2 > %@", [myArray objectAtIndex:2]); NSMutableArray *myMutableArray = [NSMutableArray arrayWithObject:[NSNumber numberWithInt:265]]; [myMutableArray addObject:[NSNumber numberWithInt:45]]; NSLog(@"Mutable Array > %@", myMutableArray);
Di baris pertama, kita membuat sebuah array dengan menggunakan metode class array:arraywithObjects:
. Metode ini menerima sejumlah variabel argumen—objek—dengan argumen terakhir nil
—yang tidak termasuk dalam array. Pada baris kedua dan ketiga, kita melakukan query pada larik untuk jumlah objek dalam array dan objek yang disimpan pada indeks 2
masing-masing.
Karena NSMutableArray
mewarisi dari NSArray
, ia berperilaku dengan cara yang sama seperti NSArray
. Perbedaan utamanya adalah objek dapat ditambahkan dan dihapus dari array setelah dibuat.
Sebelum melanjutkan, saya ingin mengatakan beberapa kata tentang NSSet
. Kelas ini mirip dengan NSArray
, tetapi perbedaan utamanya adalah bahwa kumpulan objek yang dikelola satu set tidak diurutkan dan duplikat tidak diizinkan.
Keuntungan dari NSSet
adalah bahwa query objek-objeknya lebih cepat jika Anda hanya perlu tahu apakah suatu objek terkandung dalam set. Kerangka Foundation juga mendefinisikan NSOrderedSet
. Instance dari kelas ini memiliki manfaat NSSet
, tetapi juga melacak posisi setiap objek.
NSDictionary
Seperti halnya array, kamus adalah konsep umum di sebagian besar bahasa pemrograman. Di Ruby, misalnya, mereka disebut sebagai hash. Konsep dasarnya mudah, kamus mengelola koleksi statis pasangan atau entri kunci-nilai.
Seperti dalam hash Ruby, kunci entri tidak perlu menjadi objek string per se. Ini bisa berupa semua jenis objek yang sesuai dengan protokol NSCopying
selama kuncinya unik dalam kamus. Dalam kebanyakan kasus, meskipun, dianjurkan untuk menggunakan objek string sebagai kunci.
Seperti larik, kamus tidak dapat menyimpan nilai nol. Jika Anda ingin merepresentasikan nilai null, maka Anda dapat menggunakan NSNull
. Kelas NSNull
mendefinisikan objek tunggal yang digunakan untuk melambangkan nilai nol dalam array, kamus, dan set.
Pola singleton adalah pola penting dalam banyak bahasa pemrograman. Ini membatasi instantiasi kelas ke satu objek. Anda akan berurusan dengan objek tunggal sering ketika mengembangkan aplikasi iOS.
Seperti NSArray
, framework Foundation mendefinisikan subkelas yang dapat dihapus dari NSDictionary
, NSMutableDictionary
. Ada berbagai cara untuk memberi nama kamus. Lihatlah potongan kode berikut.
NSString *keyA = @"myKey"; NSString *keyB = @"myKey"; NSDictionary *myDictionary = [NSDictionary dictionaryWithObject:@"This is a string literal" forKey:keyA]; NSLog(@"%@", [myDictionary objectForKey:keyB]);
Kita pertama kali mendeklarasikan dua objek string terpisah yang berisi string yang sama. Di baris ketiga, kita membuat instance kamus dengan memanggil metode dictionaryWithObject:forKey:
pada kelas NSDictionary
.
Selanjutnya, kita meminta kamus untuk objek yang terkait dengan isi keyB
dan log ke konsol.
Penting untuk memperhatikan detailnya. Meskipun kita menggunakan keyA
sebagai kunci pasangan kunci-nilai dan keyB
sebagai kunci untuk mengambil nilai atau objek pasangan kunci-nilai, kamus memberi kita objek yang benar. Kelas NSDictionary
cukup pintar untuk mengetahui bahwa kita menginginkan objek yang terkait dengan string myKey
. Apa artinya ini? Meskipun objek keyA
dan keyB
adalah objek yang berbeda, string yang dikandungnya sama dan itulah yang digunakan oleh kelas NSDictionary
untuk mereferensikan objek.
Fragmen kode berikut menunjukkan bahwa kamus dapat berisi kamus lain—atau susunan—dan itu juga menunjukkan cara bekerja dengan kamus yang bisa berubah.
NSMutableDictionary *myMutableDictionary = [NSMutableDictionary dictionary]; [myMutableDictionary setObject:myDictionary forKey:@"myDictionary"]; NSLog(@"%@", myMutableDictionary);
Objective-C Literals
Sebelumnya dalam artikel ini, saya memperkenalkan Anda ke literal string Objective-C, seperti @"This is a string literal."
. Mereka mengambil bentuk awalan huruf C yang diawali dengan tanda @
. Seperti yang mungkin Anda ketahui sekarang, tanda @
menunjukkan bahwa kita memasuki wilayah Objective-C.
Sebuah Objective-C literal tidak lebih dari sebuah blok kode yang merujuk objek Objective-C. Dengan rilis Xcode 4.5, Anda sekarang dapat juga menggunakan literal Objective-C untuk NSNumber
, NSArray
, dan NSDictionary
. Lihatlah potongan kode berikut untuk melihat bagaimana ini bekerja.
NSNumber *oldNumber1 = [NSNumber numberWithBool:YES]; NSNumber *newNubmer1 = @YES; NSNumber *oldNumber2 = [NSNumber numberWithInt:2147]; NSNumber *newNubmer2 = @2147; NSArray *oldArray = [NSArray arrayWithObjects:@"one", @"two", @"three", nil]; NSArray *newArray = @[@"one", @"two", @"three"]; NSDictionary *oldDictionary = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:12345] forKey:@"key"]; NSDictionary *newDictionary = @{@"key": @12345};
Tidak hanya Objective-C literals yang keren dan seksi, mereka juga membuat kode Anda lebih mudah dibaca. Mark Hammonds menulis tutorial tentang Objective-C literals. Baca posting Mark untuk gambaran yang lebih lengkap dari literal Objective-C.
Logging dengan NSLog
Dalam artikel ini, kita telah berulang kali menggunakan fungsi NSLog
, yang didefinisikan oleh kerangka Foundation. NSLog
menerima sejumlah variabel argumen dengan argumen pertama berupa string literal. String literal dapat berisi penspesifikasi format yang digantikan oleh argumen ekstra yang dilewatkan ke fungsi NSLog
.
NSLog(@"%@ - %i - %f", @"an object", 3, 3.14);
Kunjungi Mac Developer Library untuk daftar lengkap penentu format yang dapat digunakan.
Kesimpulan
Meskipun kita telah membahas banyak hal dalam artikel ini, kita hampir tidak menggores permukaan apa yang ditawarkan oleh kerangka kerja Foundation.
Tidak perlu mengetahui rincian setiap kelas atau fungsi yang didefinisikan dalam kerangka Foundation untuk memulai dengan pengembangan iOS. Anda akan belajar lebih banyak tentang kerangka Foundation ketika Anda menjelajahi SDK iOS.
Di artikel berikutnya, kita akan menjelajahi kerangka kerja UIKit dan saya juga akan membahas seluk beluk aplikasi iOS.