Skip to content Skip to sidebar Skip to footer

Belajar Swift : Cara Menggunakan Akses Kontrol di Swift

Cara Menggunakan Akses Kontrol di Swift



Belajar Swift : Cara Menggunakan Akses Kontrol di Swift - Untuk membatasi akses ke blok kode, modul dan abstraksi dilakukan melalui kontrol akses. Kelas, struktur, dan enumerasi dapat diakses sesuai dengan propertinya, metode, penginisialisasi, dan subskripnya dengan mekanisme kontrol akses. Konstanta, variabel, dan fungsi dalam protokol dibatasi dan diizinkan akses sebagai global dan lokal melalui kontrol akses. Kontrol akses yang diterapkan ke properti, tipe, dan fungsi dapat disebut sebagai 'entitas'.

Model kontrol akses didasarkan pada modul dan file sumber.

Modul didefinisikan sebagai satu unit distribusi kode dan dapat diimpor menggunakan kata kunci 'impor'. File sumber didefinisikan sebagai file kode sumber tunggal dengan modul untuk mengakses berbagai jenis dan fungsi.

Tiga tingkat akses berbeda disediakan oleh bahasa Swift 4. Mereka adalah akses Publik, Internal dan Pribadi.

S.NoLevel & Definisi Akses
1

Publik

Memungkinkan entitas untuk diproses dengan file sumber apa pun dari modul penentu mereka, file sumber dari modul lain yang mengimpor modul penentu.

2

Intern

Memungkinkan entitas untuk digunakan dalam file sumber apa pun dari modul yang menentukan, tetapi tidak dalam file sumber apa pun di luar modul itu.

3

Pribadi

Membatasi penggunaan entitas ke file sumber definisinya sendiri. Akses pribadi berperan untuk menyembunyikan detail implementasi dari fungsionalitas kode tertentu.

Sintaksis

public class SomePublicClass {}
internal class SomeInternalClass {}
private class SomePrivateClass {}

public var somePublicVariable = 0
internal let someInternalConstant = 0
private func somePrivateFunction() {}

Kontrol Akses untuk jenis Fungsi

Beberapa fungsi mungkin memiliki argumen yang dideklarasikan di dalam fungsi tanpa nilai yang dikembalikan. Program berikut mendeklarasikan a dan b sebagai argumen untuk fungsi sum (). Di dalam fungsi itu sendiri, nilai untuk argumen a dan b diteruskan dengan memanggil fungsi panggilan sum () dan nilainya dicetak sehingga menghilangkan nilai yang dikembalikan. Untuk menjadikan tipe kembalian fungsi sebagai privat, deklarasikan tingkat akses fungsi secara keseluruhan dengan pengubah privat.

private func sum(a: Int, b: Int) {
   let a = a + b
   let b = a - b
   print(a, b)
}

sum(a: 20, b: 10)
sum(a: 40, b: 10)
sum(a: 24, b: 6)

Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -

30 20
50 40
30 24

Kontrol Akses untuk jenis Pencacahan

public enum Student {
   case Name(String)
   case Mark(Int,Int,Int)
}
var studDetails = Student.Name("Swift 4")
var studMarks = Student.Mark(98,97,95)

switch studMarks {
   case .Name(let studName):
      print("Student name is: \(studName).")
   case .Mark(let Mark1, let Mark2, let Mark3):
      print("Student Marks are: \(Mark1),\(Mark2),\(Mark3).")
   
}

Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -

Student Marks are: 98,97,95

Pencacahan dalam bahasa Swift 4 secara otomatis menerima tingkat akses yang sama untuk kasus individual pencacahan. Pertimbangkan misalnya untuk mengakses nama siswa dan tanda yang diamankan dalam tiga mata pelajaran, nama pencacahan dinyatakan sebagai siswa dan anggota yang ada di kelas enumerasi adalah nama yang termasuk dalam tipe data string, tanda direpresentasikan sebagai mark1, mark2 dan mark3 dari datatype Integer. Untuk mengakses nama siswa atau nilai yang telah mereka nilai. Sekarang, switch case akan mencetak nama siswa jika blok case tersebut dijalankan jika tidak maka akan mencetak nilai yang diamankan oleh siswa tersebut. Jika kedua kondisi gagal, blok default akan dieksekusi.

Kontrol Akses untuk Subkelas

Swift 4 memungkinkan pengguna untuk membuat subkelas kelas apa pun yang dapat diakses dalam konteks akses saat ini. Subclass tidak boleh memiliki tingkat akses yang lebih tinggi dari superclassnya. Pengguna dilarang menulis subclass publik dari superclass internal.

public class cricket {
   internal func printIt() {
      print("Welcome to Swift 4 Super Class")
   }
}

internal class tennis: cricket {
   override internal func printIt() {
      print("Welcome to Swift 4 Sub Class")
   }
}

let cricinstance = cricket()
cricinstance.printIt()

let tennisinstance = tennis()
tennisinstance.printIt()

Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -

Welcome to Swift Super Class
Welcome to Swift Sub Class

Kontrol Akses untuk Konstanta, variabel, properti, dan langganan

Konstanta, variabel, atau properti Swift 4 tidak dapat didefinisikan sebagai publik daripada tipenya. Tidak valid untuk menulis properti publik dengan tipe privat. Demikian pula, subskrip tidak bisa lebih publik daripada indeks atau tipe kembaliannya.

Ketika sebuah konstanta, variabel, properti, atau subskrip menggunakan tipe privat, konstanta, variabel, properti, atau subskrip juga harus ditandai sebagai privat -

private var privateInstance = SomePrivateClass()

Getters dan Setter

Getter dan setter untuk konstanta, variabel, properti, dan subskrip secara otomatis menerima tingkat akses yang sama dengan konstanta, variabel, properti, atau subskrip miliknya.

class Samplepgm {
   var counter: Int = 0{
      willSet(newTotal) {
         print("Total Counter is: \(newTotal)")
      }
      didSet {
         if counter > oldValue {
            print("Newly Added Counter \(counter - oldValue)")
         }
      }
   }
}

let NewCounter = Samplepgm()
NewCounter.counter = 100
NewCounter.counter = 800

Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -

Total Counter is: 100
Newly Added Counter 100
Total Counter is: 800
Newly Added Counter 700

Kontrol Akses untuk Penginisialisasi dan Penginisialisasi Default

Penginisialisasi kustom dapat diberi tingkat akses yang kurang dari atau sama dengan jenis yang diinisialisasi. Penginisialisasi yang diperlukan harus memiliki tingkat akses yang sama dengan kelasnya. Jenis parameter penginisialisasi tidak boleh lebih pribadi daripada tingkat akses penginisialisasi itu sendiri.

Untuk mendeklarasikan setiap subclass dari inisialisasi kata kunci 'diperlukan' perlu didefinisikan sebelum fungsi init ().

class classA {
   required init() {
      let a = 10
      print(a)
   }
}
class classB: classA {
   required init() {
      let b = 30
      print(b)
   }
}
let res = classA()
let print = classB()

Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -

10
30
10

Penginisialisasi default memiliki tingkat akses yang sama dengan jenis yang diinisialisasinya, kecuali jenis tersebut didefinisikan sebagai publik. Ketika inisialisasi default didefinisikan sebagai publik, itu dianggap internal. Ketika pengguna membutuhkan tipe publik agar dapat diinisialisasi dengan inisialisasi tanpa argumen di modul lain, sediakan inisialisasi tanpa argumen publik secara eksplisit sebagai bagian dari definisi tipe.

Kontrol Akses untuk Protokol

Ketika kita mendefinisikan protokol baru untuk mewarisi fungsionalitas dari protokol yang ada, keduanya harus dinyatakan sebagai tingkat akses yang sama untuk mewarisi properti satu sama lain. Kontrol akses Swift 4 tidak mengizinkan pengguna untuk menentukan protokol 'publik' yang mewarisi dari protokol 'internal'.

public protocol tcpprotocol {
   init(no1: Int)
}
public class mainClass {
   var no1: Int      // local storage
   init(no1: Int) {
      self.no1 = no1 // initialization
   }
}
class subClass: mainClass, tcpprotocol {
   var no2: Int
   init(no1: Int, no2 : Int) {
      self.no2 = no2
      super.init(no1:no1)
   }
   
   // Requires only one parameter for convenient method
   required override convenience init(no1: Int) {
      self.init(no1:no1, no2:0)
   }
}

let res = mainClass(no1: 20)
let print = subClass(no1: 30, no2: 50)

print("res is: \(res.no1)")
print("res is: \(print.no1)")
print("res is: \(print.no2)")

Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -

res is: 20
res is: 30
res is: 50

Kontrol Akses untuk Ekstensi

Swift 4 tidak mengizinkan pengguna untuk menyediakan pengubah tingkat akses eksplisit untuk ekstensi ketika pengguna menggunakan ekstensi itu untuk menambahkan kesesuaian protokol. Tingkat akses default untuk setiap penerapan persyaratan protokol dalam ekstensi disediakan dengan tingkat akses protokolnya sendiri.

Kontrol Akses untuk Generik

Generik memungkinkan pengguna untuk menentukan tingkat akses minimum untuk mengakses batasan tipe pada parameter tipenya.

public struct TOS<T> {
   var items = [T]()
   mutating func push(item: T) {
      items.append(item)
   }
   mutating func pop() -> T {
      return items.removeLast()
   }
}

var tos = TOS<String>()
tos.push(item: "Swift 4")
print(tos.items)

tos.push(item: "Generics")
print(tos.items)

tos.push(item: "Type Parameters")
print(tos.items)

tos.push(item: "Naming Type Parameters")
print(tos.items)
let deletetos = tos.pop()

Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -

[Swift 4]
[Swift 4, Generics]
[Swift 4, Generics, Type Parameters]
[Swift 4, Generics, Type Parameters, Naming Type Parameters]

Kontrol Akses untuk Alias ​​Jenis

Pengguna dapat menentukan tipe alias untuk menangani tipe kontrol akses yang berbeda. Tingkat akses yang sama atau tingkat akses yang berbeda dapat ditentukan oleh pengguna. Ketika tipe alias 'pribadi' anggotanya yang terkait dapat dideklarasikan sebagai 'pribadi, internal tipe publik'. Jika tipe alias bersifat publik, anggota tidak bisa menjadi alias sebagai nama 'internal' atau 'pribadi'

Semua tipe alias yang Anda tentukan diperlakukan sebagai tipe berbeda untuk tujuan kontrol akses. Suatu alias tipe dapat memiliki tingkat akses yang kurang dari atau sama dengan tingkat akses dari jenis aliasnya. Misalnya, alias tipe privat bisa alias tipe privat, internal, atau publik, tetapi tipe alias publik tidak bisa alias tipe internal atau privat.

public protocol Container {
   associatedtype ItemType
   mutating func append(item: ItemType)
   var count: Int { get }
   subscript(i: Int) -> ItemType { get }
}
struct Stack<T>: Container {
   // original Stack<T> implementation
   var items = [T]()
   mutating func push(item: T) {
      items.append(item)
   }
   mutating func pop() -> T {
      return items.removeLast()
   }
   
   // conformance to the Container protocol
   mutating func append(item: T) {
      self.push(item: item)
   }
   var count: Int {
      return items.count
   }
   subscript(i: Int) -> T {
      return items[i]
   }
}
func allItemsMatch<
   C1: Container, C2: Container
   where C1.ItemType == C2.ItemType, C1.ItemType: Equatable>
   (someContainer: C1, anotherContainer: C2) -> Bool {
   
   // check that both containers contain the same number of items
   if someContainer.count != anotherContainer.count {
      return false
   }
   
   // check each pair of items to see if they are equivalent
   for i in 0..<someContainer.count {
      if someContainer[i] != anotherContainer[i] {
         return false
      }
   }
   // all items match, so return true
   return true
}
var tos = Stack<String>()
tos.push(item: "Swift 4")
print(tos.items)

tos.push(item: "Generics")
print(tos.items)

tos.push(item: "Where Clause")
print(tos.items)

var eos = ["Swift 4", "Generics", "Where Clause"]
print(eos)

Ketika kami menjalankan program di atas menggunakan playground, kami mendapatkan hasil sebagai berikut -

[Swift 4]
[Swift 4, Generics]
[Swift 4, Generics, Where Clause]
[Swift 4, Generics, Where Clause]

Encoding dan Decoding Cepat

Swift 4 memperkenalkan Codable Protocol baru, yang memungkinkan Anda membuat serial dan De-serialisasi tipe data kustom tanpa menulis kode khusus - dan tanpa harus khawatir kehilangan tipe nilai Anda.

struct Language: Codable {
   var name: String
   var version: Int
}
let swift = Language(name: "Swift", version: 4)
let java = Language(name: "java", version: 8)
let R = Language(name: "R", version: 3

Perhatikan bahwa Langauage sesuai dengan Codable Protocol. Sekarang kita akan mengubahnya menjadi Representasi Data Json menggunakan satu baris sederhana.

let encoder = JSONEncoder()
if let encoded = try? encoder.encode(java) {
   //Perform some operations on this value.
}

Swift secara otomatis akan menyandikan semua nilai di dalam tipe data Anda.

Anda dapat memecahkan kode data menggunakan fungsi Decoder seperti

let decoder = JSONDecoder()
if let decoded = try? decoder.decode(Language.self, from: encoded) {
   //Perform some operations on this value.
}

Baik JSONEncoder dan mitra daftar propertinya PropertyListEncoder memiliki banyak opsi untuk menyesuaikan cara kerjanya.

Post a Comment for "Belajar Swift : Cara Menggunakan Akses Kontrol di Swift"

close