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. Χρήση 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 για την εξασφάλιση στατικής ασφάλειας τύπων.