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:
-
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 -
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 -
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.