2

我正在关注标题下的 Swift 示例是否有办法常见问题解答中返回特定元素以尝试从元素中检索属性。

我直接从常见问题解答中复制了示例,但在调用 performAction 之后,textValue 仍然具有其原始值。事实上,无论我在操作块中将 inout 参数设置为什么,一旦操作返回,变量就会保留其原始值。

我错过了什么?这是我的代码:

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
    })
}

并在测试方法中:

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

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

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

印刷

in block: Floor One
outside block: 

我正在使用 XCode 版本 7.3.1

4

2 回答 2

3

检查此拉取请求中的代码以正确实现 gray_getText。 https://github.com/google/EarlGrey/pull/139

EarlGrey 团队知道文档已经过时,我们正在研究解决方案。

于 2016-07-07T18:29:20.010 回答
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)")

尽管我们希望 y 在执行结束时为 1,但 y 仍然为 0。以下是实际输出:

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

这是因为 in-out 参数不是“ call-by-reference ”,而是“ call-by-copy-restore ”。正如 bootstraponline 所指向的 PR 所指定的那样。

于 2016-07-07T18:53:59.407 回答