- Published on
Swiftda Protocols
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
Swiftda protocol metodlar yoki propertylar rejasini belgilaydi, keyin esa bu reja classlar (yoki boshqa turlar) tomonidan qabul qilinishi mumkin.
protocol yaratish uchun protocol kalit so'zidan foydalanamiz. Masalan,
protocol Greet {
// property rejasi
var name: String { get }
// metod rejasi
func message()
}
Bu yerda:
Greet— protocol nominame— o'qish mumkin bo'lgan propertymessage()— hech qanday implementatsiyasiz metod ta'rifi
Eslatmalar:
- protocol faqat metod yoki property ta'rifini o'z ichiga oladi, ularning amaliy tanasini emas.
- protocol property o'qish uchunmi yoki o'qish va yozish uchunmi ekanligini ko'rsatishi kerak.
Classni protocolga moslashtirish
Swiftda protocoldan foydalanish uchun boshqa classlar unga mos kelishi kerak. Classni protocolga moslashtirgandan so'ng, metodning amaliy implementatsiyasini ta'minlashimiz shart.
Classni protocolga moslashtirishning usuli:
// Employee classini Greet protocoliga moslashtirish
class Employee: Greet {
// propertyning implementatsiyasi
var name = "Perry"
// metodning implementatsiyasi
func message() {
print("Xayrli tong!")
}
}
Bu yerda Employee classini Greet protocoliga moslashtirdik. Shuning uchun name propertysi va message() metodining implementatsiyasini taqdim etishimiz kerak.
Misol:
protocol Greet {
// property rejasi
var name: String { get }
// metod rejasi
func message()
}
// Employee classini Greet protocoliga moslashtirish
class Employee: Greet {
// propertyning implementatsiyasi
var name = "Perry"
// metodning implementatsiyasi
func message() {
print("Xayrli tong", name)
}
}
var employee1 = Employee()
employee1.message()
Natija:
Xayrli tong Perry
Yuqoridagi misolda Greet nomli protocol yaratdik. protocol name propertysi va message() metodi rejasini o'z ichiga oladi.
Bu yerda Employee classi Greet ga mos keladi va name hamda message() ning amaliy implementatsiyasini taqdim etadi.
Misol:
protocol Polygon {
func getArea(length: Int, breadth: Int)
}
// Polygon protocoliga mos kelish
class Rectangle: Polygon {
// metodning implementatsiyasi
func getArea(length: Int, breadth: Int) {
print("To'rtburchak yuzasi:", length * breadth)
}
}
// obyekt yaratish
var r1 = Rectangle()
r1.getArea(length: 5, breadth: 6)
Natija:
To'rtburchak yuzasi: 30
Yuqoridagi misolda Polygon nomli protocol yaratdik. protocol ikki parametrli getArea() metodi rejasini o'z ichiga oladi: length va breadth.
Bu yerda Rectangle classi Polygon ga mos keladi va getArea() metodining amaliy implementatsiyasini taqdim etadi.
func getArea(length: Int, breadth: Int) {
print("To'rtburchak yuzasi:", length * breadth)
}
Bir nechta protocollarga mos kelish
Swiftda class bir nechta protocollarga ham mos kelishi mumkin. Masalan,
protocol Sum {
...
}
protocol Multiplication {
...
}
class Calculate: Sum, Multiplication {
...
}
Bu yerda Calculate nomli class Sum va Multiplication protocollariga mos keladi.
Misol:
// Sum protocolini yaratish
protocol Sum {
func addition()
}
// Multiplication protocolini yaratish
protocol Multiplication {
func product()
}
// classni ikki protocolga moslashtirish
class Calculate: Sum, Multiplication {
var num1 = 0 // birinchi son
var num2 = 0 // ikkinchi son
func addition() {
let result1 = num1 + num2
print("Yig'indi:", result1)
}
func product() {
let result2 = num1 * num2
print("Ko'paytma:", result2)
}
}
// obyekt yaratish
var calc1 = Calculate()
// propertylarga qiymat berish
calc1.num1 = 5
calc1.num2 = 10
// metodlarga murojaat
calc1.addition()
calc1.product()
Natija:
Yig'indi: 15
Ko'paytma: 50
Yuqoridagi misolda ikki protocol yaratdik: Sum va Multiplication. Shuningdek, bu ikki protocolga mos keladigan Calculate nomli class yaratdik.
Sum va Multiplication protocollari ichida mos ravishda addition() va product() nomli metodlar rejasini yaratdik.
protocol Sum {
func addition()
}
protocol Multiplication {
func product()
}
Calculate classi Sum va Multiplication ga mos kelgani uchun class ichida addition() va product() metodlarining amaliy implementatsiyasini taqdim etdik.
Nihoyat, bu metodlarga classning calc1 obyekti yordamida murojaat qildik.
// metodlarga murojaat
calc1.addition()
calc1.product()
protocol Inheritance
Classlarga o'xshab, protocollar ham boshqa protocollardan meros olishi mumkin. Masalan,
protocol Car {
...
}
protocol Brand: Car {
...
}
Bu yerda Brand protocoli Car protocolidan meros oladi. Endi agar biror class Brand ni implementatsiya qilsa, u Car va Brand ning barcha propertylari uchun implementatsiya taqdim etishi kerak.
Misol:
protocol Car {
var colorOptions: Int { get } // rang variantlari
}
// Car protocolidan meros olish
protocol Brand: Car {
var name: String { get } // nomi
}
class Mercedes: Brand {
// ikkala protocol propertylarini ham implementatsiya qilish kerak
var name: String = ""
var colorOptions: Int = 0
}
var car1 = Mercedes()
car1.name = "Mercedes AMG"
car1.colorOptions = 4
print("Nomi:", car1.name)
print("Rang variantlari:", car1.colorOptions)
Natija:
Nomi: Mercedes AMG
Rang variantlari: 4
Yuqoridagi misolda Brand protocoli Car protocolidan meros oladi.
Bu yerda Mercedes classi faqat Brand ga mos keladi. Ammo Brand Car dan meros olgani uchun biz Car va Brand ning barcha propertylarini implementatsiya qilishimiz kerak.
Eslatma: protocol bir nechta protocollardan meros olishi mumkin. Masalan,
protocol A {
...
}
protocol B {
...
}
protocol C: A, B {
...
}
protocol Extensions
Swiftda protocollarni extension kalit so'zi yordamida kengaytirishimiz mumkin. Masalan,
// protocol ta'rifi
protocol Brake {
func applyBrake()
}
// Brake protocoliga mos keladigan class yaratish
class Car: Brake {
var speed: Int = 0 // tezlik
func applyBrake() {
print("Tormoz bosildi")
}
}
// protocolni kengaytirish
extension Brake {
func stop() {
print("Dvigatel to'xtatildi")
}
}
let car1 = Car()
car1.speed = 61
print("Tezlik:", car1.speed)
car1.applyBrake()
// kengaytirilgan protocolga murojaat
car1.stop()
Natija:
Tezlik: 61
Tormoz bosildi
Dvigatel to'xtatildi
Yuqoridagi misolda applyBrake() funksiyasini belgilaydigan Brake protocolini yaratdik.
Biz Brake protocolini kengaytirib, uning ichida stop() funksiyasini e'lon qildik.
// protocolni kengaytirish
extension Brake {
func stop() {
print("Dvigatel to'xtatildi")
}
}
Kengaytirilgan protocolga car1 obyekti yordamida murojaat qilishimiz mumkin.
// kengaytirilgan protocolga murojaat
car1.stop()