Advertisement
  1. Code
  2. iOS

iOS Dari Awal Dengan Swift: Menjelajahi Kerangka Dasar

Scroll to top
Read Time: 12 min
This post is part of a series called iOS From Scratch With Swift.
iOS From Scratch With Swift: Exploring the iOS SDK
iOS From Scratch With Swift: First Steps With UIKit

() 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.

Creating a New PlaygroundCreating a New PlaygroundCreating a New Playground

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.

Inspecting the Book ClassInspecting the Book ClassInspecting the Book Class

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.

Working With the NSNumber ClassWorking With the NSNumber ClassWorking With the NSNumber Class

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.

Creating Strings in SwiftCreating Strings in SwiftCreating Strings in Swift

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.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.