Berechnet nur-lese-Eigenschaft vs.-Funktion in Swift
In der Einleitung zu Swift WWDC-session, eine nur-lese-Eigenschaft description
ist nachgewiesen:
class Vehicle {
var numberOfWheels = 0
var description: String {
return "\(numberOfWheels) wheels"
}
}
let vehicle = Vehicle()
println(vehicle.description)
Gibt es irgendwelche Auswirkungen auf die Wahl der oben erwähnten Ansatz über die Verwendung einer Methode statt:
class Vehicle {
var numberOfWheels = 0
func description() -> String {
return "\(numberOfWheels) wheels"
}
}
let vehicle = Vehicle()
println(vehicle.description())
Scheint es mir, dass die offensichtlichsten Gründe, die Sie wählen würde, eine nur-lese-berechnete Eigenschaft sind:
- Semantik - in diesem Beispiel macht es Sinn für
description
zu werden, eine Eigenschaft der Klasse, sondern als eine Aktion, die es ausführt. - Kürze/Klarheit - verhindert, dass die Notwendigkeit der Verwendung von leeren Klammern, wenn immer der Wert.
Deutlich das obige Beispiel ist zu einfach, aber gibt es noch andere gute Gründe für die Wahl einen über den anderen? Zum Beispiel gibt es einige Funktionen oder Eigenschaften leiten würde Ihre Entscheidung, welche zu benutzen?
N. B. Auf den ersten Blick scheint dies ein Recht häufiges OOP-Frage, aber ich bin daran interessiert zu wissen, dass die Swift-spezifische features, die führen würde, die beste Praxis bei der Verwendung dieser Sprache.
warten Sie, können Sie eine nur-Lesen-Eigenschaft und überspringen Sie die
get {}
? Ich wusste das nicht, danke!WWDC14-Sitzung 204 kann hier gefunden werden (video und Folien), developer.apple.com/videos/play/wwdc2014/204
InformationsquelleAutor Stuart | 2014-06-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint es mir, dass es vor allem eine Frage des Stils: ich stark bevorzugen mit Eigenschaften für nur: Eigenschaften, Bedeutung einfache Werte, die Sie bekommen können, und/oder gesetzt werden. Ich benutze Funktionen (oder Methoden), wenn die eigentliche Arbeit getan wird. Vielleicht etwas berechnet werden oder Lesen von der Festplatte oder von einer Datenbank: In diesem Fall habe ich eine Funktion verwenden, auch wenn nur eine einfache Wert zurückgegeben wird. So kann ich leicht erkennen, ob ein Anruf ist Billig (Eigenschaften) (oder ggf. teuer (Funktionen).
Werden wir wahrscheinlich mehr Klarheit darüber bekommen, wenn Apple veröffentlicht einige Swift-coding-Konventionen.
InformationsquelleAutor Johannes Fahrenkrug
Gut, Sie anwenden können, Kotlin 's Tipps https://kotlinlang.org/docs/reference/coding-conventions.html#functions-vs-properties.
Bearbeitet zu reflektieren Kotlin änderungen.
InformationsquelleAutor onmyway133
Während eine Frage der berechneten Eigenschaften von vs-Methoden im Allgemeinen ist schwierig und subjektiv, aktuell ist es ein wichtiges argument in der Swift-Fall für den Vorzug Methoden über Eigenschaften. Sie können Methoden in Swift als Reine Funktionen, die gilt nicht für Eigenschaften (wie der Swift 2.0 beta). Dies macht das Verfahren viel mehr mächtig und nützlich, da Sie daran teilhaben können, in der funktionellen Komposition.
InformationsquelleAutor Max O
Da die Laufzeit ist die gleiche, diese Frage gilt Objective-C als gut. Ich würde sagen, mit Eigenschaften, die Sie bekommen
readwrite
didSet
für Benachrichtigungen ändernAls für etwas bestimmtes zu Swift, das einzige Beispiel, das ich habe, ist, dass Sie verwenden können
@lazy
für eine Eigenschaft.InformationsquelleAutor ilya n.
Gibt es einen Unterschied:
Wenn Sie eine Immobilie, die Sie können dann überschreiben Sie Sie und machen Sie lese - /Schreibzugriff in einer Unterklasse.
Sie können hinzufügen, ein setter oder definieren Sie eine gespeicherte Eigenschaft, wenn der base-Klasse definiert den Namen wie eine Funktion? Sicherlich können Sie es tun, wenn es definiert eine Eigenschaft (das ist gerade mein Punkt), aber ich glaube nicht, Sie können es tun, wenn es definiert eine Funktion.
Einmal Swift hat private Eigenschaften (siehe hier stackoverflow.com/a/24012515/171933), können Sie einfach fügen Sie eine setter-Funktion, um die Unterklasse zu setzen, privates Eigentum. Wenn Ihr die get-Funktion wird aufgerufen, "name", Ihre setter als "setName", so dass keine Konflikte.
Sie können es bereits (der Unterschied ist, dass die Eigenschaft gespeichert, die Sie für die Unterstützung werden der öffentlichkeit). Aber der OP fragte, ob es einen Unterschied zwischen der Deklaration einer nur-lese-Eigenschaft oder eine Funktion in der Basis. Wenn Sie erklären einem nur-lese-Eigenschaft können Sie dann Lesen und schreiben in einer abgeleiteten Klasse. Eine Erweiterung, die fügt
willSet
unddidSet
base Klasse, ohne zu wissen, etwas von der Zukunft abgeleiteten Klassen, erkennt änderungen in der überschriebenen Eigenschaft. Aber Sie können nicht alles tun, wie mit Funktionen, denke ich.Wie können Sie das überschreiben einer read-only-Eigenschaft hinzufügen einen setter? Danke. Ich sehe das in den docs, "Sie kann vererbt nur-lese-Eigenschaft ist ein read-write-Eigenschaft, indem sowohl eine getter-und eine setter-in der Unterklasse Eigenschaft überschreiben" aber... was ist eine variable noch die setter schreiben?
InformationsquelleAutor Analog File
In der nur-lese-Fall, eine berechnete Eigenschaft sollte nicht werden als semantisch äquivalent zu einer Methode, selbst wenn Sie sich gleich Verhalten, da fallen die
func
Erklärung verwischt die Unterscheidung zwischen Mengen, aus denen die Zustand einer Instanz und Mengen sind lediglich Funktionen des Staates. Sie sparen die Eingabe()
auf den Ruf Website, aber riskieren, die Klarheit in Ihrem code.Als triviales Beispiel betrachten Sie die folgenden Vektor-Typ:
Indem er die Länge als eine Methode, es ist klar, dass es eine Funktion des Staates, die hängt nur auf
x
undy
.Auf der anderen Seite, wenn Sie waren zu express
length
als berechnete Eigenschaftdann, wenn man die dot-tab-complete in Ihre IDE auf eine Instanz von
VectorWithLengthAsProperty
würde es Aussehen, als obx
,y
,length
waren Eigenschaften auf Augenhöhe, die sich konzeptionell falsch.InformationsquelleAutor egnha
Gibt es Situationen, wo Sie lieber berechnete Eigenschaft über die normalen Funktionen. Wie: die Rückkehr der vollständige name einer person. Sie wissen bereits, den Vornamen und den letzten Namen. Also wirklich
fullName
Eigenschaft ist eine Eigenschaft, keine Funktion. In diesem Fall ist die berechnete Eigenschaft (denn Sie können nicht den vollen Namen, können Sie einfach entpacken Sie es mit den firstname und den lastname)InformationsquelleAutor William Kinaan
Aus der performance-Perspektive, scheint es keinen Unterschied. Wie Sie sehen können, in das benchmark-Ergebnis.
gist
main.swift
code-snippet:Ausgabe:
prop: 0.0380070209503174
func: 0.0350250005722046
prop: 0.371925950050354
func: 0.363085985183716
prop: 3.4023300409317
func: 3.38373708724976
prop: 33.5842199325562
func: 34.8433820009232
Program ended with exit code: 0
Im Diagramm:
Date()
ist nicht geeignet für benchmarks, da Sie mit dem computer-Uhr, die unter automatische updates von Betriebssystem.mach_absolute_time
bekommen würde zuverlässigere Ergebnisse.InformationsquelleAutor Durbuy
Semantisch gesprochen, berechnete Eigenschaften sollten eng gekoppelt werden mit dem inneren Zustand des Objekts - wenn andere Eigenschaften nicht ändern, dann Abfragen der berechnete Eigenschaft, die zu verschiedenen Zeiten geben sollte, die gleiche Ausgabe (vergleichbar mittels == oder ===) - vergleichbar mit dem aufrufen eine Reine Funktion auf das Objekt.
Methoden auf der anderen Seite kommen aus der box mit der Annahme, dass wir möglicherweise nicht immer die gleichen Ergebnisse, weil der Swift keinen Weg zu markieren, Funktionen als Reine. Auch Methoden in der OOP sind als Handlungen, was bedeutet, dass die Ausführung könnte dazu führen, Nebenwirkungen. Wenn die Methode keine Nebenwirkungen hat, dann kann es sicher umgewandelt werden, um eine berechnete Eigenschaft.
Beachten Sie, dass die beiden obigen Aussagen sind rein semantischer Sicht, so könnte es gut passieren, berechnete Eigenschaften haben Nebenwirkungen, die wir nicht erwarten, und Methoden, um rein zu sein.
InformationsquelleAutor Cristik
Historisch Beschreibung ist eine Eigenschaft, die auf NSObject und viele würden erwarten, dass es weiterhin das gleiche in Swift. Hinzufügen von Klammern nach es wird nur noch Verwirrung.
BEARBEITEN:
Nach dem furiosen downvoting habe ich etwas klären - wenn der Zugriff über die Punkt-syntax, es kann als eine Eigenschaft. Es ist egal, was unter der Haube. Sie können nicht auf üblichen Methoden mit dot-syntax.
Neben der Aufruf dieser Eigenschaft nicht verlangen, zusätzliche Klammern, wie bei Swift, das kann zu Verwirrung führen.
description
ist erforderlich Methode auf derNSObject
- Protokoll, und so in objective-C wird zurückgegeben mit[myObject description]
. Trotzdem, die Eigenschaftdescription
war einfach nur ein erfundenes Beispiel - ich bin auf der Suche nach einer generischen Antwort, die gilt für jede benutzerdefinierte Eigenschaft/Funktion.bearbeitet die Antwort
Danke für einige Klarstellungen. Ich bin immer noch nicht sicher, ob ich vollkommen einverstanden mit Ihrer Aussage, dass jeder parameterlosen obj-c-Methode, die einen Wert zurückgibt, kann als eine Eigenschaft, obwohl ich verstehe Ihre Argumentation. Werde ich zurückziehen meine down-vote für jetzt, aber ich denke diese Antwort ist die Beschreibung der "Semantik" Grund bereits in der Frage genannten, und cross-Sprache, die Konsistenz ist nicht wirklich das Problem hier.
InformationsquelleAutor Dvole