Ինչպես է իրականացվում մեթոդների դիսպետչինգը, որոնք ավելացվել են 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-ից
Հետևաբար, պրոտոկոլների ընդլայնումներից մեթոդները կանչվում են ստատիկ, ինչը կարևոր է հաշվի առնել ճարտարապետության նախագծման ժամանակ։