2016-11-12 8 views
3

In Objective-C, können wir eine Funktion wie folgt erklären:NULL Parameter in Swift

- (void)getRect:(CGRect *)aRectRef bRect:(CGRect *)bRectRef 
{ 
    if (aRectRef) *aRectRef = CGRectZero 
    if (bRectRef) *bRectRef = CGRectZero 
} 

und übergeben NULL an die Funktion:

CGRect rect; 
[self getRect:NULL bRect:rect] 

Es nicht NULL in Swift ist. Ich kann nicht nil als inout param direkt verwenden entweder:

func getRect(aRect aRectRef: inout CGRect?, bRect bRectRef: inout CGRect?) -> Void { 
    ... 
} 
self.getRect(&nil, bRect: rect) // <- ERROR 

Ich muss eine Variable mit Null-Wert definieren und an die Funktion übergeben, auch wenn ich die Variable nicht brauchen total.

Wie wird nil an die Funktion übergeben?

UPDATE:

null/nil in swift language erklärt nur nil in Swift.

Swift optional inout parameters and nil erläutert, wie Sie eine Variable mit Nullwert definieren und als Inout-Parameter übergeben.

Ich möchte wissen, es gibt eine Möglichkeit, Nil direkt wie &nil zu funktionieren oder nicht.

+1

Mögliche Duplikat [null/nil in swift Sprache] (http://stackoverflow.com/questions/24043589/null-nil-in-swift- Sprache) – Tibrogargan

+0

Ich habe es vorher gefunden, es hat meine Frage nicht gelöst. – Vayn

+0

Wenn Sie es schon gefunden haben, warum haben Sie es nicht in Ihrer Frage erwähnt und erklären Sie, warum die Antwort nicht hilft? – Tibrogargan

Antwort

2

Ihre Objective-C-Methode hat Nullable-Zeiger als Parameter, in Swift 3, das wäre optional UnsafeMutablePointer:

func getRect(aRectRef: UnsafeMutablePointer<CGRect>?, bRectRef: UnsafeMutablePointer<CGRect>?) { 
    if let aRectPtr = aRectRef { 
     aRectPtr.pointee = CGRect(x: 1, y: 2, width: 3, height: 4) 
    } 
    if let bRectPtr = bRectRef { 
     bRectPtr.pointee = CGRect(x: 5, y: 6, width: 7, height: 8) 
    } 
} 

var rect = CGRect.zero 
getRect(aRectRef: &rect, bRectRef: nil) 
print(rect) // (1.0, 2.0, 3.0, 4.0) 

So können Sie nil als Argument übergeben. Was kann man nicht tun (im Gegensatz zu Objective-C) ist die Adresse einer nicht initialisierten Variable übergeben, rect muss hier initialisiert werden.

Das gleiche kompakter geschrieben werden können als

func getRect(aRectRef: UnsafeMutablePointer<CGRect>?, bRectRef: UnsafeMutablePointer<CGRect>?) { 

    aRectRef.map { $0.pointee = CGRect(x: 1, y: 2, width: 3, height: 4) } 
    bRectRef.map { $0.pointee = CGRect(x: 5, y: 6, width: 7, height: 8) } 
} 
+0

'UnsafeMutablePointer' scheint ein wenig schwierig, obwohl dies die beste Antwort ist. – Vayn

0

Entschuldigung, ich bin nicht berechtigt, zu diesem Zeitpunkt einen Kommentar hinzuzufügen, also schreibe ich dies als Antwort. In SWIFT haben Sie den Parameter als inout definiert, Sie müssen eine Variable und nicht literal nil übergeben. Sie können etwas tun,

func testGetRect() 
    { 
     var recta: CGRect? = nil 
     var rectb: CGRect? = CGRect() 

     self.getRect(aRect: &recta, bRect: &rectb) 
    } 

    func getRect(inout aRect aRectRef: CGRect?, inout bRect bRectRef: CGRect?) -> Void 
    { 
     if (aRectRef != nil) 
     { 
      aRectRef = CGRectZero 
     } 
     if (bRectRef != nil) 
     { 
      bRectRef = CGRectZero 
     } 

    } 

Ja „, müssen Sie eine Variable mit Null definieren und an die Funktion übergeben. Ich einige Casting versucht zu sehen, ob es funktioniert, konnte aber nicht. Die Parameterübergabe mit inout ist wie C++ - Parameter, der durch Verweis übergeben wird, dh foo (int & parama, int & paramb). Sie müssen eine Variable an foo übergeben. Ich glaube nicht, dass SWIFT Parameter übergeben hat wie das obj-c-Beispiel.