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

    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] ичинде мүмкүн эмес. Ал эми, протоколдор, чектелген гениралыктар же энумдар колдонулуп, статикалык тиб коопсуздукту камсыз кылуу үчүн колдонулат.