ios - 致命错误:浮点值无法转换为 Int,因为它要么是无限的要么是 NaN
问题描述
我在尝试将浮点数转换为 Int 时遇到致命错误。
调试:
好的,所以有这条线来跟踪页面滚动。
浮动(scrollView.contentOffset.x)/浮动(scrollView.frame.size.width)
这会返回值,例如:
2.031401 2.0241547 2.018116 2.013285 2.009662 2.0072465 2.0048308 2.0036232 2.0024154 2.0012078 2.0
我们想把它四舍五入;我们不希望将浮点数作为小数点,这可能是由于中途滚动马虎造成的
我在这里使用所以我使用 floorf: floorf(Float(scrollView.contentOffset.x) / Float(scrollView.frame.size.width))
它返回的值如下:0.0、1.0、2.0。完美的。但是 var currentPage 只需要 Int
现在我们将其转换为 Int: pageControl.currentPage = Int(floorf(Float(scrollView.contentOffset.x) / Float(scrollView.frame.size.width)))
这会产生以下错误:
浮点值无法转换为 Int,因为它要么是无限的要么是 NaN
完整代码:
import UIKit
class pageViewController: UIViewController {
private let scrollView = UIScrollView()
private let pageControl: UIPageControl = {
let pageControl = UIPageControl()
pageControl.numberOfPages = 5
pageControl.backgroundColor = .systemBlue
return pageControl
}()
override func viewDidLoad() {
super.viewDidLoad()
scrollView.delegate = self
scrollView.backgroundColor = .red
pageControl.addTarget(self,
action: #selector(pageControlDidChange(_:)),
for: .valueChanged)
view.addSubview(scrollView)
view.addSubview(pageControl)
}
@objc private func pageControlDidChange(_ sender: UIPageControl) {
let current = sender.currentPage
scrollView.setContentOffset(CGPoint(x: CGFloat(current) * view.frame.size.width,
y: 0), animated: true)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
pageControl.frame = CGRect(x: 10,
y: view.frame.size.height-100,
width: view.frame.size.width-20,
height: 70)
scrollView.frame = CGRect(x: 0,
y: 0,
width: view.frame.size.width,
height: view.frame.size.height-100)
if scrollView.subviews.count == 2 {
//2 is because a view by default does not have any subviews. whereas a scroll view does have a subview by default. A scroll view inherently starts with 2 subviews; vertical and horizontal scroll indicators
configureScrollViews()
}
}
private func configureScrollViews() {
scrollView.contentSize = CGSize(width: view.frame.size.width*5, height: view.frame.size.height)
scrollView.isPagingEnabled = true //snaps pages to the middle of the screen
}
}
问题出在下面的函数中
extension pageViewController: UIScrollViewDelegate {
///everytime a scrollView scrolls we want to calculate what page we're on. This sums up this func.
func scrollViewDidScroll(_ scrollView: UIScrollView) {
pageControl.currentPage = Int(floorf(Float(scrollView.contentOffset.x) / Float(scrollView.frame.size.width))) //we want to round it down; we dont want to have a floating point as a decimal point which can be a result of a a sloppy halfway scroll
let colors: [UIColor] = [
.systemRed,
.systemPink,
.systemTeal,
.systemGray,
.systemIndigo
]
for x in 0..<5 {
let page = UIView(frame: CGRect(x: CGFloat(x)*view.frame.size.width, y: 0, width: view.frame.size.width, height: scrollView.frame.size.height))
page.backgroundColor = colors[x]
scrollView.addSubview(page)
}
//print(floorf(Float(scrollView.contentOffset.x) / Float(scrollView.frame.size.width)) )
}
}
解决方案
您可以在下面的方法中调试并打印以下值:
floorf(Float(scrollView.contentOffset.x) / Float(scrollView.frame.size.width))
并了解数值范围;检查是否打印了任何NaN
或值。Infinite
推荐阅读
- google-colaboratory - NotFoundError:iris_training.csv
- java - 输入 Java 检查整数中的错误
- c# - 通过正则表达式确定字符串中特定子字符串的顺序
- c++ - 矢量方向计算中的数值误差
- laravel - 使用Vue js上传图片时如何显示图片预览?
- python - Plt.Scatter at seaborn:错误:系列的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()
- python - IDE 不建议所选对象上可用的方法
- c - 如何从C中的文件中的列表中制作邻接矩阵
- haskell - 无法从临时文件中读取
- oop - 子类型与子类:两者之间的区别