() translation by (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 untuk mengembangkan aplikasi iOS.
Sebuah Kata Tentang Yayasan Inti
Dalam artikel sebelumnya, saya secara singkat menyebutkan Core Foundation dan hubungannya dengan Foundation. Meskipun kami tidak akan secara eksplisit menggunakan kerangka Core Foundation di sisa seri ini, sangat berguna untuk memahami kerangka kerja dan untuk mengetahui perbedaannya dari saudara kandung yang berorientasi objek, Foundation, yang akan Anda gunakan secara ekstensif.
Sementara kerangka kerja Foundation diimplementasikan dalam Objective-C, kerangka Core Foundation berbasis 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.
Sangat penting untuk dicatat bahwa Automatic Reference Counting (ARC) tidak mengelola 'objek' Core Foundation. Ini berarti Anda bertanggung jawab untuk mengelola memori ketika bekerja dengan Core Foundation. Mike Ash menulis artikel bagus tentang Penghitungan Referensi Otomatis dan cara menggunakan ARC dengan Core Foundation dan bridging bebas pulsa.
Kunjungi Core Foundation framework reference Apple jika Anda ingin mempelajari lebih lanjut tentang kerangka kerja dan untuk daftar lengkap dari jenis kerangka kerja yang buram.
Latihan, Latihan, Latihan
Mempelajari keterampilan baru paling baik dilakukan melalui latihan. Mari kita mulai dengan membuat taman bermain baru di Xcode. Beri nama playground Foundation dan tetapkan Platform ke iOS. Klik Next untuk lanjutkan. Beri tahu Xcode tempat Anda ingin menyimpan taman bermain dan klik Buat.



Seperti inilah isi dari taman bermain.
1 |
//: Playground - noun: a place where people can play
|
2 |
|
3 |
import UIKit |
4 |
|
5 |
var str = "Hello, playground" |
Taman bermain berisi komentar di atas, pernyataan impor untuk kerangka kerja UIKit, dan deklarasi variabel. Di sebelah kanan, Anda dapat melihat keluaran taman bermain.
Karena kami akan bekerja dengan kerangka kerja Yayasan, kami perlu mengganti pernyataan impor untuk UIKit dengan pernyataan impor untuk Yayasan. Hapus komentar di atas, perbarui pernyataan impor, dan hapus deklarasi variabel.
1 |
import Foundation |
Foundation
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
.
Protokol
Beberapa bahasa, seperti Perl, Python, dan C, menyediakan dukungan untuk multiple inheritance. Ini berarti bahwa suatu kelas dapat diturunkan dari — menjadi subkelas — lebih dari satu kelas.
Meskipun Swift dan Objective-C tidak memberikan dukungan untuk multiple inheritance, mereka mendukung multiple inheritance melalui spesifikasi dalam bentuk protokol. Kami sudah membahas protokol sebelumnya dalam seri ini, tetapi ada detail penting yang belum kami diskusikan.
Metode Opsional dan Diperlukan
Ingat bahwa setiap metode protokol Swift diperlukan. Jika suatu jenis yang sesuai dengan protokol Swift tidak mengimplementasikan setiap properti dan metode yang ditentukan oleh protokol, kompiler akan melemparkan kesalahan. Ini tidak berlaku untuk protokol Objective-C. Dalam Objective-C, metode protokol dapat ditandai sebagai opsional. Jika metode protokol adalah opsional, jenis yang sesuai dengan protokol tidak diperlukan untuk menerapkan metode.
Karena sebagian besar kerangka kerja SDK iOS ditulis dalam Objective-C, kita akan menemui sejumlah protokol Objective-C yang menentukan metode opsional. Yang penting untuk diingat adalah bahwa setiap properti dan metode protokol Swift diperlukan.
Manfaat
Manfaat protokol banyak ragamnya. Ketika kelas mengadopsi atau sesuai dengan protokol, kelas diharapkan untuk mengimplementasikan metode yang dinyatakan oleh protokol. Bagi sebagian dari Anda, protokol mungkin mengingatkan antarmuka di Jawa. Ini berarti bahwa protokol dapat digunakan untuk menyatakan antarmuka ke suatu objek tanpa mengungkapkan jenis objek.
Warisan berganda memiliki manfaatnya, tetapi yang pasti memiliki kelemahannya. Keuntungan dari protokol adalah jenis yang tidak terkait, enum, kelas, dan struktur, masih dapat berbagi perilaku yang sama melalui penggunaan protokol.
NSObject
Selain kelas root NSObject
, framework Foundation juga mendefinisikan protokol NSObject
. Namun, di Swift, kelas dan protokol tidak boleh memiliki nama yang sama. Akibatnya, protokol NSObject
dikenal sebagai NSObjectProtocol
di Swift.
Objek yang sesuai dengan protokol NSObjectProtocol
dapat ditanyakan tentang kelas dan superclass mereka, dapat dibandingkan dengan objek lain, dan respond to self
. This is only a small subset of the behavior added to objects conforming to the NSObjectProtocol
protocol.
NSCoding
Objek yang sesuai dengan protokol NSCoding
dapat dikodekan dan didekodekan. Ini diperlukan untuk objek yang perlu diarsipkan atau didistribusikan. Arsip objek, misalnya, terjadi ketika objek atau objek grafik disimpan ke disk.
NSCopying
Protokol NSCopying
hanya menyatakan satu metode, copyWithZone(_:)
. Jika kelas mendukung objek penyalinan, kelas harus sesuai dengan protokol NSCopying
. Menyalin objek dilakukan dengan mengirimnya pesan copy()
atau copyWithZone(_:)
.
Class
NSObject
Kelas NSObject
adalah kelas akar dari sebagian besar hierarki kelas Objective-C. Mengapa itu penting jika kita tertarik pada Swift? Ingat bahwa sebagian besar kerangka kerja dari SDK iOS diberdayakan oleh Objective-C. Bahkan jika Anda memutuskan untuk mengembangkan aplikasi di Swift, Anda masih akan menggunakan Objective-C di bawah kap mesin.
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 / NSObjectProtocol
, yang kita diskusikan beberapa saat yang lalu.
Mari kita lihat apa yang kita dapatkan secara gratis jika kelas mewarisi dari kelas NSObject
. Tambahkan cuplikan kode berikut ke taman bermain Anda. Ini seharusnya terlihat familier jika Anda telah membaca artikel sebelumnya dari seri ini. Kami menyatakan kelas, Buku
, yang mewarisi dari NSObject
. Class Book
mengimplementasikan dua metode instan, chapters()
dan pages()
.
1 |
class Book: NSObject { |
2 |
func chapters() { |
3 |
|
4 |
}
|
5 |
|
6 |
func pages() { |
7 |
|
8 |
}
|
9 |
}
|
Karena Book
mewarisi dari NSObject
dan NSObject
sesuai dengan protokol NSObjectProtocol
, kita dapat menanyakan kelas Book
tentang perilaku dan pohon warisan. Lihatlah contoh berikut.



Pertama-tama kami meminta Class Book
tentang dirinya sendiri dengan memohon classForCoder()
pada kelas Book
. Metode classForCoder()
adalah metode kelas, yang berarti kita dapat memanggil metode ini pada Class Book
itu sendiri. Selanjutnya, kami bertanya Class Book
tentang kelas superclass atau induknya, kelas yang langsung mewarisi darinya. Ini mengembalikan opsional karena tidak setiap kelas memiliki kelas induk. Tidak mengherankan, superclass of Book
adalah NSObject
.
Baris berikutnya memberitahu kita bahwa Book
sesuai dengan protokol NSObjectProtocol
, yang tidak terduga karena mewarisi sifat ini dari kelas NSObject
. Kami juga belajar bahwa Book
tidak sesuai dengan protokol NSCoding
.
Tampaknya Class Book
tidak menanggapi method chapters()
. Ini tidak aneh karena chapters()
adalah metode instan, bukan metode kelas. Hal ini terbukti dengan dua baris terakhir dari contoh kami di mana kami memberi contoh Instansi Book
dan menanyakan contoh pertanyaan yang sama.
Dalam contoh di atas, kami menggunakan metode respondsToSelector(_:)
, tetapi Anda mungkin bertanya-tanya apa pemilih itu? Apa artinya 'menanggapi selektor'? Selektor adalah kata mewah untuk nama fungsi atau metode. Selektor digunakan oleh runtime Objective-C untuk mengirim pesan ke objek. Singkat cerita, jika Anda membaca pemilih kata, maka pikirkan fungsi atau metode. Detail yang lebih baik berada di luar cakupan tutorial ini.
NSNumber
Class NSNumber
adalah class utilitas yang mengelola salah satu jenis data numerik dasar. Ini adalah subclass dari class NSValue
, yang menyediakan pembungkus berorientasi objek untuk jenis skalar, pointer, struktur, dan id objek. Class NSNumber
mendefinisikan metode untuk mengambil nilai yang disimpannya, untuk membandingkan nilai, dan juga untuk mengembalikan representasi string dari nilai yang disimpan.
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 cuplikan kode berikut ke taman bermain Anda.



Kami membuat instance NSNumber
baru dengan memberikan nilai Double
ke init(double:)
. Selanjutnya, kami meminta nilai yang tersimpan menggunakan tiga metode NSNumber
yang berbeda. Seperti yang Anda lihat, hasilnya tidak selalu mencerminkan nilai yang tersimpan di myNumber
.
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. Ini mirip dengan tipe String
Swift.
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, 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 inisialisasi.
Ada berbagai cara untuk membuat objek string. Cara paling sederhana untuk membuat objek string adalah dengan memanggil metode string()
pada kelas NSString
. Ini mengembalikan objek string kosong. Lihatlah class reference NSString
untuk daftar lengkap penginisialisasi.
Jalur umum lainnya untuk membuat objek string adalah melalui string literal. Dalam contoh berikut, string literal ditugaskan ke stringA
. Pada waktu kompilasi, kompilator akan mengganti string literal dengan turunan NSString
.



Perhatikan bahwa kita tidak bergantung pada inferensi tipe Swift untuk menentukan jenis stringA
. Contoh kedua, stringB
, menunjukkan mengapa itu terjadi. Jika kita tidak secara eksplisit menentukan jenis stringA
sebagai NSString
, Swift berpikir kita ingin membuat contoh String
. Contoh ini juga menggambarkan bahwa NSString
mewarisi dari NSObject
sementara String
tidak. Ingat bahwa tipe String
di Swift adalah struktur dan struktur yang tidak mendukung pewarisan.
Class NSString
memiliki berbagai 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 dihapus, NSMutableString
, dengan menambahkan cuplikan berikut ke taman bermain Anda.
1 |
let stringA: NSString = "This is " |
2 |
let stringB: NSString = NSString(string: "a mutable string.") |
3 |
|
4 |
var mutableString = NSMutableString(string: stringA) |
5 |
mutableString.appendString(stringB as String) |
Kita mulai dengan membuat dua instance NSString
, satu menggunakan sintaks literal dan satu menggunakan init(string:)
initializer. String yang bisa berubah kemudian dibuat dengan melewatkan string pertama sebagai argumen. Untuk mengilustrasikan string yang dapat berubah dapat dimodifikasi setelah dibuat, stringB
ditambahkan ke string yang dapat berubah dan nilainya dicetak.
NSArray
dan NSSet
Class NSArray
mengelola suatu daftar objek yang tidak berubah dan teratur. Kerangka Foundation juga mendefinisikan subkelas yang dapat berubah dari NSArray
, NSMutableArray
. Class NSArray
berperilaku sangat mirip dengan array C atau Swift dengan perbedaan bahwa instance NSArray
mengatur objek. Class NSArray
menyatakan berbagai metode yang memfasilitasi bekerja dengan array, seperti metode untuk mencari dan menyortir objek dalam array.
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 di artikel ini.
Tambahkan cuplikan kode berikut ke taman bermain Anda untuk menjelajahi NSArray
dan mitranya yang dapat berubah, NSMutableArray
.
1 |
let myArray = NSArray(objects: "Bread", "Butter", "Milk", "Eggs") |
2 |
print(myArray.count) |
3 |
print(myArray.objectAtIndex(2)) |
4 |
|
5 |
var myMutableArray = NSMutableArray(object: NSNumber(int: 265)) |
6 |
myMutableArray.addObject(NSNumber(int: 45)) |
Kami membuat larik dengan menggunakan init(objects:)
initializer. Metode ini menerima sejumlah argumen variabel. Selanjutnya, kami mencetak jumlah objek dalam larik dan meminta larik untuk objek pada indeks 2
.
Karena NSMutableArray
mewarisi dari NSArray
, ia berperilaku dengan cara yang sama seperti NSArray
. Perbedaan utama adalah objek dapat ditambahkan dan dihapus dari array setelah inisialisasi.
Sebelum melanjutkan, saya ingin mengatakan beberapa kata tentang NSSet
. Class ini mirip dengan NSArray
, tetapi perbedaan utamanya adalah bahwa kumpulan objek yang dikelola oleh satu set tidak diurutkan dan satu set tidak dapat berisi duplikat.
Keuntungan dari NSSet
adalah bahwa query objek-objeknya lebih cepat jika Anda hanya perlu tahu apakah suatu objek terkandung dalam set. Framework 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 value. Jika Anda ingin merepresentasikan nilai null, maka Anda dapat menggunakan NSNull
. Class 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 subclass yang dapat dihapus dari NSDictionary
, NSMutableDictionary
. Ada berbagai cara untuk memberi nama kamus. Lihatlah potongan kode berikut.
1 |
let keyA: NSString = "myKey" |
2 |
let keyB: NSString = "myKey" |
3 |
|
4 |
let myDictionary = NSDictionary(object: "This is a string literal", forKey: keyA) |
5 |
|
6 |
print(myDictionary.objectForKey(keyB)) |
Kami menyatakan dua objek NSString
terpisah yang berisi string yang sama. Kami kemudian instantiate kamus dengan memohon init(objek:forKey:)
. Lalu, kami meminta kamus untuk objek yang terkait dengan isi keyB
dan mencetak nilainya.
Penting untuk memperhatikan detailnya. Meskipun kami menggunakan keyA
sebagai kunci pasangan kunci-nilai dan keyB
sebagai kunci untuk mengambil nilai atau objek pasangan kunci-nilai, kamus memberi kami objek yang benar (sebagai opsional). 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.
Sebelum kita menyelesaikan tutorial ini, saya ingin menunjukkan contoh kamus dan larik bertingkat dan contoh NSMutableDictionary
. Fragmen kode berikut menunjukkan bahwa kamus dapat berisi kamus lain — atau susunan — dan itu juga menunjukkan cara bekerja dengan kamus yang bisa berubah.
1 |
let myMutableDictionary = NSMutableDictionary() |
2 |
myMutableDictionary.setObject(myDictionary, forKey: "myDictionary") |
Kesimpulan
Meskipun kami membahas banyak hal dalam artikel ini, kami hampir tidak menggores permukaan apa yang ditawarkan oleh kerangka kerja Yayasan. 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.
Pada artikel berikutnya, kami menjelajahi kerangka kerja UIKit dan saya juga membahas seluk beluk aplikasi iOS.
Jika Anda memiliki pertanyaan atau komentar, Anda dapat meninggalkannya di komentar di bawah atau menghubungi saya di Twitter.