首页 > 解决方案 > 致命错误:浮点值无法转换为 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))   )
}
}

标签: iosswiftuiscrollviewtype-conversioninteger

解决方案


您可以在下面的方法中调试并打印以下值:

floorf(Float(scrollView.contentOffset.x) / Float(scrollView.frame.size.width))

并了解数值范围;检查是否打印了任何NaN或值。Infinite


推荐阅读