Swift: Array Extensions für einen gewissen Objekttyp

Die Features von Swift sind vielseitig. Eines davon ist das es möglich ist, für einen genauen Typ eines Arrays Extensions zu definieren. Somit hat man innerhalb der Methoden und Computed Variables die volle Datenmacht des jeweiligen Types.

Swift Playground

Die spezielle Schreibweise des Extensionkopfes extension Array where Element : Vehicle zeigt schon genau an, für welchen Typ man diese Erweiterung eines Arrays schreibt.

Als Beispiel dient ein rudimentäres Vehicle-Objekt:

/// Represents an abstract data model
/// of a vehicle 
class Vehicle
{
    /// Vendor of the vehicle
    var vendor  = ""
    
    /// Defines wether the vehicle is able to fly
    var flyable = false
    
    /// Defines the type of the vehicle
    var type = VehicleType.Unknown
    
    // MARK: - Init -
    
    convenience init(vendor: String, flyable: Bool, type: VehicleType)
    {
        self.init()
        
        self.vendor     = vendor
        self.flyable    = flyable
        self.type       = type
    }
}

Die passende Extension hierzu lässt sich wie folgt erstellen:

extension Array where Element : Vehicle
{
    /// Contains all flyable vehicles
    var flyables: [Vehicle]
    {
        return self.filter({$0.flyable})
    }
    
    /// Returns all vehicles of the given type
    ///
    /// - parameter type: Desired VehicleType
    /// - return        : List of vehicles with desired type
    func ofType(type: VehicleType) -> [Vehicle]
    {
        return self.filter({$0.type == type})
    }
}

Diese neuen Funktionen und Variablen lassen sich schließlich wie gewohnt aufrufen. Als Beispielsausgabe:

// Create dataset

var vehicles = [Vehicle]()
vehicles.append(Vehicle(vendor: "Eurocopter", flyable: true, type: .Helicopter))
vehicles.append(Vehicle(vendor: "BMW", flyable: false, type: .Car))
vehicles.append(Vehicle(vendor: "Audi", flyable: false, type: .Car))

// Call custom array type extension method

vehicles.flyables
// Output: [{vendor "Eurocopter", flyable true, Helicopter}]

vehicles.ofType(.Car)
// Output: [{vendor "BMW", flyable false, Car}, 
//          {vendor "Audi", flyable false, Car}]

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s