Sobes.tech
Middle

Swiftda massivda pastki turlarni qanday cheklash mumkin?

sobes.tech AI

AIdan javob

Swift tilida, bir xil turdagi elementlarga ega massivlarda subtiplarni to'g'ridan-to'g'ri cheklash mumkin emas. Biroq, shunga o'xshash xatti-harakatni quyidagi yondashuvlar yordamida amalga oshirish mumkin:

  1. Protokollarni ishlatish: Ruxsat etilgan barcha subtiplar uchun umumiy protokolni aniqlang va uni massiv elementlari turi sifatida foydalaning.

    protocol SpecificType {}
    
    class SubtypeA: SpecificType {}
    class SubtypeB: SpecificType {}
    class AnotherType {}
    
    var specificArray: [SpecificType] = [] // faqat SpecificType ni amalga oshiradigan turlarni o'z ichiga olgan massiv
    
    specificArray.append(SubtypeA())
    specificArray.append(SubtypeB())
    // specificArray.append(AnotherType()) // Kompilyatsiya xatosi, AnotherType protokolga mos emas
    
  2. Protokol cheklovlari bilan generiklardan foydalanish: Agar siz o'zingizning kolleksiyangiz yoki funksiyangizni yaratgan bo'lsangiz, protokol cheklovlari bilan generiklardan foydalanishingiz mumkin.

    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>() // faqat SubtypeA ni o'z ichiga olgan massiv
    // var invalidArray = RestrictedArray<AnotherType>() // Kompilyatsiya xatosi, AnotherType protokolga mos emas
    
  3. Enum bilan ishlash (asosiy qiymatlari bilan): Agar subtiplar soni doimiy va oldindan ma'lum bo'lsa, enumdan foydalanish mumkin.

    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())) // ichki turdagi xato
    

Shunday qilib, standart [SomeType] massivida subtiplarni to'g'ridan-to'g'ri cheklash mumkin emas. Buning o'rniga, protokollar, cheklovlar bilan generiklar yoki enumlar yordamida statik turdagi xavfsizlik ta'minlanadi.