Sobes.tech
Middle+

Protokoldakı seçimli funksiyanı nə pozur?

sobes.tech Süni İntellekt

AI-dan cavab

Tələblərin protokolə əlavə edilməsi digər modullar və ya kitabxanalar tərəfindən istifadə edildikdən sonra. Əgər protokol artıq qəbul olunub və həyata keçirilibsə, adi (seçimli olmayan) metodların və ya xüsusiyyətlərin əlavə edilməsi bütün istifadə olunan yerlərdə tərtib səhvlərinə səbəb olacaq, bu yeni tələblər yerinə yetirilənə qədər.

Seçimli tələblər protokolları mövcud həyata keçirilməsini pozmadan genişləndirməyə imkan verir. Siniflər və ya strukturlar yalnız bəzi seçimli metodları həyata keçirə bilər. Bu, delegatlar ilə işləyərkən və ya artıq mövcud API-yə yeni funksiyalar əlavə edərkən faydalıdır.

Objective-C-də protokol üçün seçimli tələbin nümunəsi (Swift @optional-i @objc olmadan dəstəkləmir):

// Swift-də `@optional` `@objc` protokolu ilə istifadə olunur
import Foundation

@objc protocol MyDelegate {
    func requiredMethod() -> Bool

    @optional func optionalMethod1()
    @optional func optionalMethod2(value: Int)
}

class MyClass {
    weak var delegate: MyDelegate?

    func doSomething() {
        if delegate?.requiredMethod() == true {
            // Seçimli metodu yoxlamadan çağırırıq
            delegate?.optionalMethod1?()

            if let delegate = delegate {
                if delegate.responds(to: #selector(delegate.optionalMethod2(value:))) {
                    delegate.optionalMethod2?(value: 10)
                }
            }
        }
    }
}

Swift-də @objc olmadan saf protokollar seçimli dəstəyi təmin etmir. Seçimli tələblər üçün protokol @objc ilə işarələnməlidir. Bu protokolların həyata keçirilməsi üçün genişləndirmələr istifadə edilə bilər və bu, Swift-də daha müasir yanaşmadır.

Swift-də protokol genişləndirmələri vasitəsilə seçimli davranış nümunəsi:

// Daha Swift-ə uyğun yanaşma: protokol genişləndirmələri ilə defolt implementasiyalar
protocol MyProtocol {
    func requiredMethod() -> Bool
    func optionalMethod1()
    func optionalMethod2(value: Int)
}

// Standart implementasiyalar təmin edirik
extension MyProtocol {
    func optionalMethod1() {
        // Standart boş implementasiya və ya standart davranış
        print("Seçimli metod üçün defolt implementasiya")
    }

    func optionalMethod2(value: Int) {
        // Standart boş implementasiya
        print("Seçimli metodun defolt implementasiyası, dəyər: \(value)")
    }
}

class MyClassSwift {
    var delegate: MyProtocol?

    func doSomething() {
        if delegate?.requiredMethod() == true {
            // Metodları nil yoxlamadan çağırırıq, çünki
            // ya sinif/strukturda implementasiya olunub, ya da
            // genişləndirmədən istifadə olunur
            delegate?.optionalMethod1()
            delegate?.optionalMethod2(value: 20)
        }
    }
}

class MyCustomDelegate: MyProtocol {
    func requiredMethod() -> Bool {
        print("Tələb olunan metod həyata keçirildi")
        return true
    }

    // optionalMethod1() və optionalMethod2(value:) mütləq deyil,
    // genişləndirmədən istifadə ediləcək.
    // Amma başqa davranış üçün yenidən yaza bilər:
    // func optionalMethod1() {
    //     print("Seçimli metodun xüsusi implementasiyası")
    // }
}

let customDelegate = MyCustomDelegate()
let myClassSwift = MyClassSwift()
myClassSwift.delegate = customDelegate
myClassSwift.doSomething()

Beləliklə, artıq istifadə olunan protokolda yeni mütləq tələbi əlavə etməyə cəhd, geriyə uyğunluğu pozur. Seçimli tələblər (@objc və ya protokol genişləndirmələri vasitəsilə) bu problemi qarşısını alır.