Sobes.tech
Junior — Middle

Ինչպես է իրականացվում մեթոդների դիսպետչինգը, որոնք ավելացվել են Extension-ով պրոտոկոլներում?

sobes.tech AI

Պատասխան AI-ից

Swift պրոտոկոլների ընդլայնումներով ավելացված մեթոդները իրականացվում են ստատիկ բաժանման միջոցով: Սա նշանակում է, որ այդ մեթոդների կանչը որոշվում է կոմպիլյացիայի ժամանակ, ոչ թե գործարկման ժամանակ: Բացառությամբ մեթոդներից, որոնք անմիջապես հայտարարված են պրոտոկոլում (որոնք օգտագործում են դինամիկ բաժանում վիրտուալ մեթոդների աղյուսակի միջոցով), ընդլայնումներից եկող մեթոդները չեն կարող վերաշարադրվել կոնկրետ տիպերում և կանչվում են ուղղակի ըստ տիպի, որը հայտնի է կոմպիլյացիայի ժամանակ:

Օրինակ, եթե ունեք պրոտոկոլ և ընդլայնում մի մեթոդով, և հետո մի տիպ, որը իրականացնում է այդ պրոտոկոլը, ապա ընդլայնումից եկող մեթոդի կանչը միշտ օգտագործելու է ընդլայնումից, նույնիսկ եթե տիպը իրականացնում է նույն անունով մեթոդ: Դա կապված է այն բանի հետ, որ ընդլայնումները չեն ավելացնում մեթոդներ պրոտոկոլի վիրտուալ կանչերի աղյուսակին:

protocol MyProtocol {}

extension MyProtocol {
    func greet() {
        print("Բարև ընդլայնումից")
    }
}

struct MyStruct: MyProtocol {
    func greet() {
        print("Բարև MyStruct-ից")
    }
}

let obj: MyProtocol = MyStruct()
obj.greet() // Տպում է: Բարև ընդլայնումից

let obj2 = MyStruct()
obj2.greet() // Տպում է: Բարև MyStruct-ից

Հետևաբար, պրոտոկոլների ընդլայնումներից մեթոդները կանչվում են ստատիկ, ինչը կարևոր է հաշվի առնել ճարտարապետության նախագծման ժամանակ։