Чӣ тавр маҳдуд кардани зинаҳои зер дар массив дар 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>() // Масіў толькі SubtypeA, якія рэалізуюць SpecificType // var invalidArray = RestrictedArray<AnotherType>() // Памылка кампілірацыі, AnotherType не адпавядае пратаколу -
Выкарыстанне пералічэння (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] немагчыма. Замест гэтага выкарыстоўваюцца пратаколы, генерыкі з абмежаваннямі або пералічэнні для забеспячэння статычнай тыпавай бяспекі.