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] немагчыма. Замест гэтага выкарыстоўваюцца пратаколы, генерыкі з абмежаваннямі або пералічэнні для забеспячэння статычнай тыпавай бяспекі.