Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 不调用先前函数的递归_Ios_Swift_Algorithm_Recursion_Uicollectionview - Fatal编程技术网

Ios 不调用先前函数的递归

Ios 不调用先前函数的递归,ios,swift,algorithm,recursion,uicollectionview,Ios,Swift,Algorithm,Recursion,Uicollectionview,如何创建一个递归函数,该函数一旦被调用,将只执行具有下一个索引的当前被调用函数 要自动滚动的集合视图嵌套在第一个表视图单元格中 我一直在尝试创建一个递归函数,它可以作为常规循环使用。无法使用循环,因为它在后台线程上运行 这是我的代码: var indexItem = 1 func autoScroll(time: Int) { DispatchQueue.main.async { self.run(after: time) { cell._col

如何创建一个递归函数,该函数一旦被调用,将只执行具有下一个索引的当前被调用函数

要自动滚动的集合视图嵌套在第一个表视图单元格中

我一直在尝试创建一个递归函数,它可以作为常规循环使用。无法使用循环,因为它在后台线程上运行

这是我的代码:

var indexItem = 1

func autoScroll(time: Int) {
    DispatchQueue.main.async {
        self.run(after: time) {
            cell._collectionView.scrollToItem(
                at: IndexPath(row: indexItem, section: 0),
                at: .centeredHorizontally, animated: true
            )
            indexItem += 1
            autoScroll(time: 3)
            return
        }
    }
}

autoScroll(time: 3)

问题是它总是先用前面的索引调用函数,然后用实际的索引执行函数。

我相信您要做的是:

func autoScroll(time: DispatchTimeInterval, indexItem: Int = 1) {
    DispatchQueue.main.asyncAfter(deadline: .now() + time) {
        cell._collectionView.scrollToItem(at: IndexPath(row: indexItem, section: 0), at: .centeredHorizontally, animated: true)
        autoScroll(time: time, indexItem: indexItem + 1)
    }
}

autoScroll(time: .seconds(3))
只需将值传递给函数


不过,你真的需要一些旗子来阻止这一切。如前所述,这是为了确保永远不会释放
单元
。如果多个细胞运行这个,那么它肯定会引起一个问题。我希望它直接在集合视图上运行,而不是在单元格上运行。

我相信您正在尝试这样做:

func autoScroll(time: DispatchTimeInterval, indexItem: Int = 1) {
    DispatchQueue.main.asyncAfter(deadline: .now() + time) {
        cell._collectionView.scrollToItem(at: IndexPath(row: indexItem, section: 0), at: .centeredHorizontally, animated: true)
        autoScroll(time: time, indexItem: indexItem + 1)
    }
}

autoScroll(time: .seconds(3))
只需将值传递给函数


不过,你真的需要一些旗子来阻止这一切。如前所述,这是为了确保永远不会释放
单元
。如果多个细胞运行这个,那么它肯定会引起一个问题。我希望它直接在集合视图上运行,而不是在单元格上运行。

它“总是调用上一个函数”是什么意思?它首先使用上一个索引执行scrollToItem(),因此它会向后滚动,然后是当前项,在所有这些之后,将进一步滚动到列表中的下一项。我需要的是一个递归函数,它将作为一个常规循环工作。循环无法使用,因为它在后台线程上运行。也许您可以后退一步,描述您正在尝试解决的实际问题,而不是我们尝试诊断此解决方案的特定尝试。这种“只发生一次的递归”的概念似乎很奇怪,所以我暂时抛开它,专注于更广泛的问题。您想做什么?
autoScroll(时间:3*indexItem)
在两个函数调用位置都可以工作?;它“总是调用上一个函数”是什么意思?它首先使用上一个索引执行scrollToItem(),所以它会向后滚动,然后返回到当前项,然后再滚动到列表中的下一项。我需要的是一个递归函数,它可以作为常规循环工作。循环无法使用,因为它在后台线程上运行。也许您可以后退一步,描述您正在尝试解决的实际问题,而不是我们尝试诊断此解决方案的特定尝试。这种“只发生一次的递归”的概念似乎很奇怪,所以我暂时抛开它,专注于更广泛的问题。您想做什么?
autoScroll(时间:3*indexItem)
在两个函数调用位置都可以工作?;