2017-07-26 19 views
0

Swift Standard Library断言:序列下降(而:)看似是一无所

下降(而:)

返回跳过元素,同时谓词返回true,并返回剩余元素序列。

通过使用函数签名:

的闭合件,是以序列的元素作为它的参数,并返回:其中predicate被描述为

func drop(while predicate: (Self.Element) throws -> Bool) rethrows -> Self.SubSequence 

指示元素是否匹配的布尔值。

我的问题是,这样的描述下,不应该会出现以下行为:

let test = (0...3).drop { $0 > 1 } 
test.contains(0) // true 
test.contains(3) // true 

回答

1

我不知道为什么你不理解这种行为。文档非常清晰,并且与输出相匹配。

该文档说,该方法将继续跳过(删除)元素,而谓词是真实的。它就像一个while循环:

// not real code, for demonstration purposes only 
while predicate(sequence.first) { 
    sequence.dropFirst() 
} 

然后返回剩余的序列。

对于序列0...3,它基本上是[0, 1, 2]对不对?

第一个元素0是否满足您的谓词$0 > 1?不,所以假想的while循环中断,没有东西被丢弃,所以原始序列被返回。

我觉得你很困惑这可能是prefix

随着prefix,它将继续向谓词为真的序列添加元素,并在谓词变为false时返回序列。

let test = (0...3).prefix { $0 > 1 } 
test.contains(0) // false 
test.contains(3) // false 
+0

我的印象是该方法在遍历整个序列时放弃了元素。如果是这种情况,$ 0会引用当前元素(就像map,filter,reduce等一样)。所以尽管'test.contains(0)'应该是true,'test.contains(3)'应该是false,对吧? –

+0

@BrandonBradley我猜这里的文档不太清楚。当我看到方法的签名时,我立即想到了一个while循环,然后删除了序列的第一个元素,而谓词却是真的。 – Sweeper

+0

嗯,我现在明白了为什么呼叫站点参数被命名为while。该方法现在更有意义,谢谢。 –

0

0不大于1,所以drop完成“下降”立即,并返回整个序列。

也许你正在寻找filter(_:)prefix(while:)

+0

所以该方法不会遍历整个序列? –