Was ist der Zweck von Swifts OptionSetType
Protokoll, und wie unterscheidet es sich von nur Set
zu nutzen, um diese SetAlgebraType
Methoden zu bekommen?OptionSetType Protokoll Swift
Antwort
Ich werde aus der praktischen Perspektive beantworten, wenn Sie OptionSetType
verwenden. Für mich ist der Zweck von OptionSetType
, alle Bit-Manipulation in C/ObjC zu entfernen.
Betrachten Sie ein Beispiel, wenn Sie eine Funktion haben, die die Grenzen eines Rechtecks zeichnet. Der Benutzer kann ihn bitten, zwischen 0 und 4 Grenzen zu zeichnen.
Hier ist der Code in Swift:
struct BorderType: OptionSetType {
let rawValue: Int
init (rawValue: Int) { self.rawValue = rawValue }
static let Top = BorderType(rawValue: 1 << 0)
static let Right = BorderType(rawValue: 1 << 1)
static let Bottom = BorderType(rawValue: 1 << 2)
static let Left = BorderType(rawValue: 1 << 3)
}
func drawBorder(border: BorderType) {
// Did the user ask for a Left border?
if border.contains(.Left) { ... }
// Did the user ask for both Top and Bottom borders?
if border.contains([.Top, .Bottom]) { ... }
// Add a Right border even if the user didn't ask for it
var border1 = border
border1.insert(.Right)
// Remove the Bottom border, always
var border2 = border
border2.remove(.Bottom)
}
drawBorder([.Top, .Bottom])
Und in C:
typedef enum {
BorderTypeTop = 1 << 0,
BorderTypeRight = 1 << 1,
BorderTypeBottom = 1 << 2,
BorderTypeLeft = 1 << 3
} BorderType;
void drawBorder(BorderType border) {
// Did the user ask for a Left border?
if (border & BorderTypeLeft) { ... }
// Did the user ask for both Top and Bottom borders?
if ((border & BorderTypeTop) && (border & BorderTypeBottom)) { ... }
// Add a Right border even if the user didn't ask for it
border |= BorderTypeRight;
// Remove the Bottom border, always
border &= ~BorderTypeBottom;
}
int main (int argc, char const *argv[])
{
drawBorder(BorderTypeTop | BorderTypeBottom);
return 0;
}
C kürzer ist aber, auf einen Blick, wer kann sagen, was diese Zeile tut?
border &= ~BorderTypeBottom;
Während macht diesen Augenblick Sinn:
var border2 = border
border2.remove(.Bottom)
Er paßt in Swifts Ziel, einen ausdruck sein, einfache Sprache zu lernen, zu vergleichen, zu der spartanischen Philosophie von C.
OptionSetType
können Sie Ihre Klasse SetAlgebraType
konform zu machen, ohne etwas Implementierung, unter der Annahme, dass Ihre Klasse ist RawRepresentable
und seine rohe Darstellung ist BitwiseOperationsType
. Dazu werden Standardimplementierungen für nine methods von SetAlgebraType
bereitgestellt.
Der Hauptunterschied gegenüber der Nutzung Set
ist, dass Sie nichts für eine gute Anzahl von Typen schreiben müssen, z. integrierte Typen. Alles, was Sie tun müssen, ist, Ihren Rohdarstellungstyp mit OptionSetType
konform zu machen, und Sie erhalten alle Implementierungen kostenlos.
Es unterscheidet mich von ein Set in dem es ist nicht ein Set. Es ist eine Objective-C-Enumeration, deren Werte Bitmasken sind. Die Idee ist, Ihnen eine Möglichkeit zu geben, ein solches Enum in Swift so zu importieren, dass Sie es mit Set-ähnlicher Bequemlichkeit und Sicherheit manipulieren können, aber in Wirklichkeit bilden Sie eine ganze Zahl mit bitweisem und bitweisem oder. In Objective-C müssten Sie die Ganzzahl direkt konstruieren, indem Sie den bitwise-or-Operator verwenden. Aber Swift rettet dich davor, das tun zu müssen.
So Sie könnte sagen:
let val =
UIViewAnimationOptions.Autoreverse.rawValue |
UIViewAnimationOptions.Repeat.rawValue
let opts = UIViewAnimationOptions(rawValue: val)
... und in Objective-C, würden Sie das tun müssen, in der Tat. Aber Swift lässt Sie stattdessen sagen:
var opts = UIViewAnimationOptions.Autoreverse
opts.insert(.Repeat)
- 1. Swift-Protokoll mit Element, das von ‚ObjectSetType‘ ist
- 2. Mit Protokoll in Swift
- 3. Swift: Protokoll Standardimplementierung - didSet
- 4. Swift-Protokoll funktioniert nicht
- 5. Swift Delegierte und Protokoll
- 6. ObjC Protokoll Implementierung in Swift
- 7. Konnte MKAnnotation Protokoll in Swift
- 8. Swift-Protokoll-Deklaration: Argument Labels?
- 9. Swift Protokoll-Erweiterungen mit Aufzählungen
- 10. Swift-Protokoll als generische Typ
- 11. Swift: Typ nicht entspricht Protokoll
- 12. Wechseln Sie, um mehrere Fälle von OptionSetType
- 13. Swift: Protokoll vs. Struktur vs. Klasse
- 14. Swift Allgemeine Klasse eine Objective-C-Protokoll
- 15. Optionale Methoden im Swift-Protokoll und Überlastung
- 16. Swift: Entspricht nicht dem Protokoll NSCoding
- 17. swift 2.0 - UITextFieldDelegate Protokoll-Erweiterung funktioniert nicht
- 18. Swift 2: @objc Protokoll und ENUM Array
- 19. Swift assoziierten Arten und Protokoll Vererbung
- 20. Swift deklarieren Klasse Func im Protokoll
- 21. Swift Delegate-Protokoll für generische Klasse
- 22. Swift-Protokoll für die String-Interpolation
- 23. Wie statische Methode nach Protokoll in Swift
- 24. Swift: Limit-Klassen nur unterstützt Protokoll
- 25. Swift Initialisierung von konstanten Variablen im Protokoll
- 26. wie man Protokoll in uiviewcontroller, swift verwendet
- 27. Swift: Instantiate-Klasse (AnyClass) gemäß Protokoll
- 28. Swift 2.2 #selector für Delegierte/Protokoll Kompilierungsfehler
- 29. Protokoll: Kann 'X' in 'Y' in Swift
- 30. Implementieren Ziel c-Protokoll in Swift