Swift: Arbeiten mit Extensions

In klassischen Programmiersprachen wie C++, Java und natürlich auch in Swift lassen sich Klassen erweitern durch Vererbung.
class Vehicle {
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
// do nothing - an arbitrary vehicle doesn't necessarily make a noise
}
}
class Bicycle: Vehicle {
var hasBasket = false
}
In Obigem Beispiel wird eine Klasse "Vehicle" definiert und eine Klasse "Bicycle", die alle Variablen und Funktionen erbt.
Diese Vererbung und Erweiterung ist auf Klassen beschränkt. Doch Swift kennt neben Klassen auch Structs oder andere Typen.
Hier sind Extensions ein Hilfsmittel, um elegant ohne Vererbung neue Funktionen zu einem Datentyp, egal ob es eine Klasse, eine Struktur etc. ist zuzufügen:
class Vehicle {
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
// do nothing - an arbitrary vehicle doesn't necessarily make a noise
}
}
extension Vehicle {
var hasBasket = false
}
Hier wird der Klasse "Vehicle" die Variable "hasBasket" hinzugefügt.
Hier eine praktische Anwendung. Webentwickler arbeiten in der Regel mit hexadezimalen Farbwerten, zum Beispiel: 7E7DFF was bedeutet 7E (Rotanteil) 7D (Grünanteil) und FF (Blauanteil).

Die Klasse Color hat keine Möglichkeit direkten hexadezimale Farbstring einzugeben. Hier setzen wir eine Extension ein.
extension Color {
init(hex: String) {
let hex = hex.trimmingCharacters(
in: CharacterSet.alphanumerics.inverted
)
var int: UInt64 = 0
Scanner(string: hex).scanHexInt64(&int)
let r: UInt64
let g: UInt64
let b: UInt64
switch hex.count {
case 6: (r, g, b) = (int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
default: (r, g, b) = (1, 1, 1)
}
self.init(
.sRGB,
red: Double(r) / 255,
green: Double(g) / 255,
blue: Double(b) / 255,
opacity: 1
)
}
}
In der Extension wird ein neuer Initializer eingeführt, der als Parameter einen hexadezimalen String nutzt. Der String wird mit der Scanner-Klasse gescannt und in einen Integerwert überführt. Dann wird diese Integerwert bitweise in die drei RGB-Werte überführt und dann der klassische Initializer übergeben.
Genutzt wird die Klasse wie folgt:
Color(hex: "7E7DFF")
So sieht es dann aus:
