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>() // only SubtypeA, ишке ашырган SpecificType // var invalidArray = RestrictedArray<AnotherType>() // Компиляция ката, AnotherType прококолго туура келбейт -
Асоциативдүү маанилери бар энум колдонуу: Эгер подтиптердин саны так жана алдын ала белгилүү болсо, энумду колдонсо болот.
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] ичинде мүмкүн эмес. Ал эми, протоколдор, чектелген гениралыктар же энумдар колдонулуп, статикалык тиб коопсуздукту камсыз кылуу үчүн колдонулат.