2016-07-07 8 views
2

Ich verfolge das Swift-Beispiel unter der Überschrift Gibt es eine Möglichkeit, ein spezifisches Element von FAQ zurückzugeben, um zu versuchen, eine Eigenschaft von einem Element abzurufen.GREYActionBlock zum Zurückgeben bestimmter Elementeigenschaften funktioniert nicht

Ich habe das Beispiel direkt aus den FAQ kopiert, aber nach dem Aufruf von performAction hat textValue immer noch seinen ursprünglichen Wert. Unabhängig davon, auf was ich den Inout-Parameter im Aktionsblock eingestellt habe, behält die Variable ihren ursprünglichen Wert bei, sobald die Aktion zurückkehrt.

Was fehlt mir? Hier ist der Code, ich habe:

func grey_getText(inout text: String) -> GREYActionBlock { 
    return GREYActionBlock.actionWithName("get text", 
     constraints: grey_respondsToSelector(Selector("text")), 
     performBlock: { element, errorOrNil -> Bool in 
      text = element.text 
      print("in block: \(text)") 
      return true 
    }) 
} 

und in der Testmethode:

var textValue = "" 
let domainField = EarlGrey().selectElementWithMatcher(grey_text("Floor One")) 

domainField.assertWithMatcher(grey_sufficientlyVisible()) 
domainField.performAction(grey_getText(&textValue)) 

print("outside block: \(textValue)") 

druckt

in block: Floor One 
outside block: 

Ich bin mit XCode Version 7.3.1

+0

Dies scheint etwas mit der Art und Weise zu tun, wie Sie Blöcke verwenden, erhalten Sie das gleiche Ergebnis, wenn Sie GREYActionBlock.actionWithName (... 'direkt auf eine Variable zuweisen und verwenden (anstatt die Funktion' grey_getText 'um es zu bekommen)? – Gautam

Antwort

3
func incrementer(inout x: Int) ->() ->() { 
    print("in incrementer \(x)") 
    func plusOne() { 
    print("in plusOne before \(x)") 
    x += 1; 
    print("in plusOne after \(x)") 
    } 
    return plusOne 
} 

var y = 0; 
let f = incrementer(&y) 
print("before \(y)") 
f(); 
print("after \(y)") 

Obwohl wir erwarten würden, y am Ende der Ausführung auf 1 bleibt y 0 ist hier die tatsächliche Ausgabe:

in incrementer 0 
before 0 
in plusOne before 0 
in plusOne after 1 
after 0 

Dies liegt daran, in-out-Parameter nicht "call-by-reference" ist , aber "call-by-copy-restore". wie die PR von bootstraponline angegeben.

Verwandte Themen