Sobes.tech
Middle

Ինչպես սահմանափակել ենթատեսակները Swift-ում զանգվածում?

sobes.tech AI

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

Swift-ում հնարավոր չէ ուղղակի սահմանափակել ենթատեսակները հոմոգենային տարրերով զանգվածների համար: Սակայն, կարելի է հասնել նման վարքագծի, օգտագործելով հետևյալ մոտեցումները:

  1. Պրոտոկոլի օգտագործում: Նկարագրել ընդհանուր պրոտոկոլ բոլոր թույլատրելի ենթատեսակների համար և օգտագործել այն որպես զանգվածի տարրերի տիպ:

    protocol SpecificType {}
    
    class SubtypeA: SpecificType {}
    class SubtypeB: SpecificType {}
    class AnotherType {}
    
    var specificArray: [SpecificType] = [] // Զանգված, որը պարունակում է միայն այն տիպերը, որոնք իրականացնում են SpecificType
    
    specificArray.append(SubtypeA())
    specificArray.append(SubtypeB())
    // specificArray.append(AnotherType()) // Կոմպիլյացիայի սխալ, AnotherType-ը չի համապատասխանում պրոտոկոլին
    
  2. Գեներիկների օգտագործում պրոտոկոլի սահմանափակմամբ: Եթե ստեղծում եք սեփական հավաքածու կամ ֆունկցիա, կարող եք օգտագործել գեներիկներ սահմանափակմամբ պրոտոկոլով:

    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-ը չի համապատասխանում պրոտոկոլին
    
  3. Էնմի օգտագործում (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] հնարավոր չէ: Փոխարենը օգտագործվում են պրոտոկոլներ, գեներիկներ սահմանափակումներով կամ էնմներ՝ ստատիկ տիպային անվտանգության ապահովման համար։