2016-06-02 20 views
0

Ist es möglich, eine let -Eigenschaft mit einem ähnlichen Funktionsparameter zu inout zu verwenden, wenn ich nicht die Eigenschaft selbst, aber die Eigenschaft Eigenschaften ändern möchte?Swift Inout-Parameter für const Eigenschaften

z.B.

let someLine = CAShapeLayer() 

func setupLine(inout line:CAShapeLayer, startingPath: CGPath) { 
    line.path = startingPath 
    line.strokeColor = UIColor.whiteColor().CGColor 
    line.fillColor = nil 
    line.lineWidth = 1 
} 

setupLine(&someLine, startingPath: somePath) 

Auch wenn es eine bessere Art und Weise ist eine Reihe von Eigenschaften auf die gleiche Weise einzurichten, wenn sie nicht in einer Schleife, die hilfreich sein würden.

+0

Sie brauchen nicht 'inout' überhaupt hier – Alexander

Antwort

3

CAShapeLayer ist eine Klasse und somit ein Referenztyp.

let someLine = CAShapeLayer() 

ist eine konstante Referenz auf ein Objekt CAShapeLayer. Sie können diese Referenz einfach an die Funktion übergeben und die Eigenschaften des referenzierten Objekts innerhalb der Funktion ändern. Es besteht keine Notwendigkeit für die & Betreiber oder inout:

func setupLine(line: CAShapeLayer, startingPath: CGPath) { 
    line.path = startingPath 
    line.strokeColor = UIColor.whiteColor().CGColor 
    line.fillColor = nil 
    line.lineWidth = 1 
} 

let someLine = CAShapeLayer() 
setupLine(someLine, startingPath: somePath) 

Eine mögliche Alternative ist eine Bequemlichkeit initializer

extension CAShapeLayer { 
    convenience init(lineWithPath path: CGPath) { 
     self.init() 
     self.path = path 
     self.strokeColor = UIColor.whiteColor().CGColor 
     self.fillColor = nil 
     self.lineWidth = 1 
    } 
} 

so dass die Schicht als

let someLine = CAShapeLayer(lineWithPath: somePath) 
erstellt werden kann

Ein komplettes Beispiel für Ihren Spielplatz. Beachten Sie, dass es Standardparameter verwendet, um es vielseitig:

import UIKit 

class ShapedView: UIView{ 
    override var layer: CALayer { 
     let path = UIBezierPath(ovalInRect:CGRect(x:0, y:0, width: self.frame.width, height: self.frame.height)).CGPath 
     return CAShapeLayer(lineWithPath: path) 
    } 
} 

extension CAShapeLayer { 
    convenience init(lineWithPath path: CGPath, strokeColor:UIColor? = .whiteColor(), fillColor:UIColor? = nil, lineWidth:CGFloat = 1) { 
     self.init() 
     self.path = path 
     if let strokeColor = strokeColor { self.strokeColor = strokeColor.CGColor } else {self.strokeColor = nil} 
     if let fillColor = fillColor { self.fillColor = fillColor.CGColor } else {self.fillColor = nil} 
     self.lineWidth  = lineWidth 
    } 
} 


let view = ShapedView(frame: CGRect(x:0, y:0, width: 100, height: 100)) 

Ergebnis mit Standardeinstellungen:

screenshot

+0

Vielen Dank, total lesen Die Dokumente wong: Klasse 'Instanzen' sind Referenztypen, Funktionen sind Referenztypen, Alles andere ist ein Werttyp. Danke auch für die Alternative! – richy

+0

Dies ist ein perfektes Beispiel, um zu veranschaulichen, wie Standardwerte für Methodenparameter nützlich sind: https://gitlab.com/snippets/20356 @Martin R: Fühlen Sie sich frei, diesen Code zu Ihrer Antwort hinzuzufügen, wenn Sie möchten. – vikingosegundo

+0

@vikingosegundo: Guter Vorschlag, danke, aber ist zu spät für heute :) Fühlen Sie sich frei, diesen zu bearbeiten oder Ihre eigene Antwort hinzuzufügen! –