这本书有一个章节清单。
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.>>>
}
答案 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
。