Ինչպես սահմանափակել ենթատեսակները Swift-ում զանգվածում?
sobes.tech AI
Պատասխան AI-ից
Swift-ում հնարավոր չէ ուղղակի սահմանափակել ենթատեսակները հոմոգենային տարրերով զանգվածների համար: Սակայն, կարելի է հասնել նման վարքագծի, օգտագործելով հետևյալ մոտեցումները:
-
Պրոտոկոլի օգտագործում: Նկարագրել ընդհանուր պրոտոկոլ բոլոր թույլատրելի ենթատեսակների համար և օգտագործել այն որպես զանգվածի տարրերի տիպ:
protocol SpecificType {} class SubtypeA: SpecificType {} class SubtypeB: SpecificType {} class AnotherType {} var specificArray: [SpecificType] = [] // Զանգված, որը պարունակում է միայն այն տիպերը, որոնք իրականացնում են SpecificType specificArray.append(SubtypeA()) specificArray.append(SubtypeB()) // specificArray.append(AnotherType()) // Կոմպիլյացիայի սխալ, AnotherType-ը չի համապատասխանում պրոտոկոլին -
Գեներիկների օգտագործում պրոտոկոլի սահմանափակմամբ: Եթե ստեղծում եք սեփական հավաքածու կամ ֆունկցիա, կարող եք օգտագործել գեներիկներ սահմանափակմամբ պրոտոկոլով:
struct RestrictedArray<T: SpecificType> { private var elements: [T] = [] mutating func append(_ element: T) { elements.append(element) } func getElements() -> [T] { return elements } } // var validArray = RestrictedArray<SubtypeA>() // Զանգված միայն SubtypeA, որոնք իրականացնում են SpecificType // var invalidArray = RestrictedArray<AnotherType>() // Կոմպիլյացիայի սխալ, AnotherType-ը չի համապատասխանում պրոտոկոլին -
Էնմի օգտագործում (Enum) հետ ասոցացվող արժեքներով: Եթե ենթատեսակների քանակը ֆիքսված է և հայտնի מראש, կարելի է օգտագործել էնմ:
enum AllowedSubtypes { case typeA(SubtypeA) case typeB(SubtypeB) } class SubtypeA {} class SubtypeB {} var enumArray: [AllowedSubtypes] = [] enumArray.append(.typeA(SubtypeA())) enumArray.append(.typeB(SubtypeB())) // enumArray.append(.typeA(SubtypeB())) // Տիպի սխալ ասոցացվող արժեքում
Այսպիսով, ուղղակի սահմանափակել ենթատեսակները ստանդարտ զանգվածում [SomeType] հնարավոր չէ: Փոխարենը օգտագործվում են պրոտոկոլներ, գեներիկներ սահմանափակումներով կամ էնմներ՝ ստատիկ տիպային անվտանգության ապահովման համար։