Swift 3 Zugang von privat-Eigenschaften in eine Struktur, die aus einer Erweiterung
Ich habe auf der Suche durch das swift-docs und die Arbeit durch einige Beispiele, um die Kapselung, und ich bin nicht sicher über das Verhalten, das ich sehe. Ich habe mir für ähnliche Fragen auf stack, schaute durch den doc und sah durch einige tutorials (siehe link unten) und obwohl dies eine triviale Frage finden Sie keine Antwort (evtl. im Swift hat sich geändert?)
Erstellen einer einfachen Struktur repräsentiert eine Warteschlange:
struct Queue<Element> {
private var elements = [Element]()
mutating func enqueue(newElement: Element) {
elements.append(newElement)
}
mutating func dequeue() -> Element? {
guard !elements.isEmpty else {
return nil
}
return elements.remove(at: 0)
}
}
Ist später erweitert durch:
extension Queue {
func peek() -> Element? {
return elements.first
}
}
Aber natürlich Elemente unzugänglich ist aufgrund der privaten Schutz-Ebene.
Es funktioniert durch das ändern der Zugriff auf Elemente fileprivate - aber warum?
Mein Verständnis war, dass Erweiterungen waren Teil des einschließenden Typ, und Suche rund um das Internet, es scheint, dass ist verwendet auf diese Weise zu arbeiten https://www.andrewcbancroft.com/2015/04/22/3-nuances-of-swift-extensions/
So ist mein Verständnis von Sichtbarkeit falsch, oder hat Swift sich geändert?
- Sie sollten drop-parameter-Namen wie
newElement
, die nicht hinzufügen, eine sinnvolle information, um den Anruf Website - Auch werden Sie wahrscheinlich wollen, um zu implementieren eine queue als Ringspeicher. Die Entfernung von der start eines array ist teuer.
- Ok, aber dies soll nur ein kleines Beispiel zur Verdeutlichung des Problems.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der Swift-Buch:
So ein
private
variable nur zugänglich innerhalb der geschweiften Klammern, wo es definiert wird. Swift Access Control hat nie wie die von C++Java oder C#.
private
im Swift 2 Verhalten sich identisch zufileprivate
im Swift-3. Es wäre noch erlaubt Zugriff auf die variable, wenn Sie Ihre Erweiterung wurde in einer anderen Datei.Release von Swift 4 dies wurde geändert. Sie können sich die doc hier
Privates Mitglied in der Verlängerung
Beispiel unten ist von Swift 4