在Swift中比较数组值后如何移动索引值的问题

时间:2019-07-18 07:10:52

标签: ios arrays swift

这本书有一个章节清单。 let chapterList = self.bookDetail? .bookChapterList -> 7,49,73,109,163,195,236,241

我将此字符串更改为数组

它将与self.bookPage

进行比较

如果self.bookPage是25。

如果我点击previousChapterBtnTapped, 如果self.bookPage想要在章节列表中转到7,

如果self.bookPage是68。

如果我点击previousChapterBtnTapped, 我希望self.bookPage进入列表中的第49章。

@IBAction func previousChapterBtnTapped(_ sender: Any) {
        // ["7", "13", "113", "245", "311", "427"]
        let chapterListArr = bookDetail?.bookChapterList.components(separatedBy: ",")

    <<<i need...>>>
    <<< I will need to compare chapterListArr and self.bookPage. Please let me know your grammar.>>>    
    }

4 个答案:

答案 0 :(得分:1)

将章节转换为整数数组,并使用lastIndex查找上一章

let chapterListArr =  bookDetail?.bookChapterList.components(separatedBy: ",").compactMap { Int($0) } 

let index = chapterListArr.lastIndex(where: { $0 <= bookPage}) ?? 0
bookPage = chapterListArr[index]

此解决方案使用数组的索引,因此,如果bookPage小于第一章(7),它将转到第一章。一种替代解决方案可能是

if let index = chapterListArr.lastIndex(where: { $0 <= bookPage}) {
    bookPage = chapterListArr[index]
} 

如果少于第一章,这将使bookPage保持不变,在这种情况下,要转到1这样的特定页面,只需添加else

答案 1 :(得分:0)

根据我对上述信息的理解,您需要转到特定章节,但要使用pages数组。制作一个像本章开头或本章末尾的标记以及pages数组,以标识该页面是本章的开头还是本章末尾。

OR

您可以保留两个单独的数组,一个包含页面,另一个包含章节信息。 只需比较两个数组,章节就会出现在页面中,因为同一页面响应开始和结束。

如果我不满意更详细的信息,请纠正我。

很高兴为您提供帮助,祝您编码愉快:)

答案 2 :(得分:0)

所以您想弄清楚这是哪一章?

    var array = ["7", "13", "113", "245", "311", "427"].map{Int($0)!}

public func getChapter(from page: Int) {
    var currentChapter = 0
    array.enumerated().forEach({ (offset, chapterBeginning) in
        if page >= chapterBeginning {
            currentChapter = offset+1
        }
    })

    print(currentChapter)
}

getChapter(from: 311)

这将为您提供当前章节。将其转换为int,然后查看页面大于或等于该章开头的位置。

答案 3 :(得分:0)

假设bookChapterList总是按数字排序,则可以首先将字符串转换为Int,反转整个过程,继续删除元素直到该元素小于页码,然后取第一个之后一个。

let intChapterList = chapterListArr.map { Int($0)! }
self.bookPage = intChapterList.reversed().drop(while: { $0 >= self.bookPage }).first ?? 1

请注意,我使用?? 1来表示,如果所有元素都已被使用(这意味着我们排在第一章),那么我们将返回第一页。如果您的书籍的第一页显示为0,请将其更改为?? 0