Πώς περιορίζετε τους υποτύπους σε έναν πίνακα σε 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 δεν υλοποιεί το πρωτόκολλο -
Χρήση enumeration με συσχετισμένες τιμές: Αν ο αριθμός των υποτύπων είναι σταθερός και γνωστός εκ των προτέρων, μπορείτε να χρησιμοποιήσετε enumeration.
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] array δεν είναι δυνατή. Αντ' αυτού, χρησιμοποιούνται πρωτόκολλα, γενικά με περιορισμούς ή enumeration για την εξασφάλιση στατικής ασφάλειας τύπων.