ошибки при использовании UIPageViewController

Я использую этот код для создания читалки, подобного любым ридерам электронных книг, с использованием UIPageViewController, но у меня есть некоторые ошибки в коде (отмечены комментариями):

  1. Expression resolves to an unused property Initializer for conditional
  2. binding must have Optional type, not 'TextDataViewController' 'nil' is
  3. incompatible with return type 'TextDataViewController'

Как это исправить?

Это мой код:

class ReadViewController: UIViewController, NSLayoutManagerDelegate {
    
    @IBOutlet weak var contentView: UIView!
    let dataSource = ["1","2","3","4"]
    var currentViewControllerIndex = 0
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        configurePageViewController()
    }
    
    func configurePageViewController() {
        guard let pageViewController = storyboard?.instantiateViewController(withIdentifier: String(describing: TextPageViewController.self)) as? TextPageViewController else {
            return
        }
        
        pageViewController.delegate.self // error: Expression resolves to an unused property 
        pageViewController.dataSource .self // error: Expression resolves to an unused property 

        
        addChildViewController(pageViewController)
        pageViewController.didMove(toParentViewController: self)
        
        pageViewController.view.translatesAutoresizingMaskIntoConstraints = false
        
        contentView.addSubview(contentView)
        
        let views: [String: Any] = ["pageView": pageViewController.view]
        
        contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[pageView]-0-|",
                                                                 options: NSLayoutConstraint.FormatOptions(rawValue: 0),
                                                                 metrics: nil,
                                                                 views: views))
        
        contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[pageView]-0-|",
                                                                 options: NSLayoutConstraint.FormatOptions(rawValue: 0),
                                                                 metrics: nil,
                                                                 views: views))
        
        guard let startingViewController = detailViewControllerAt(index: currentViewControllerIndex) else{  // error: Initializer for conditional binding must have Optional type, not 'TextDataViewController'

            return
        }
        
        pageViewController.setViewControllers([startingViewController]?, direction: .forward, animated: true)
    }
    
    func detailViewControllerAt(index: Int) -> TextDataViewController {
        
        if index >= dataSource.count || dataSource.count == 0 {
            return nil // error: 'nil' is incompatible with return type 'TextDataViewController'
        }
        
        guard let dataViewController = storyboard?.instantiateViewController(withIdentifier: String(describing: TextDataViewController.self)) as? TextDataViewController else {
            return nil // error: 'nil' is incompatible with return type 'TextDataViewController'
        }
        
        dataViewController.index = index
        dataViewController.displayText = dataSource[index]
        
        return dataViewController
    }
    
}

extension ReadViewController: UIPageViewControllerDelegate, UIPageViewControllerDataSource {

    func presentationIndex(for pageViewController: UIPageViewController) -> Int {

        print ("presentationIndex \(currentViewControllerIndex)")

        return currentViewControllerIndex
    }

    func presentationCount(for pageViewController: UIPageViewController) -> Int {

        print ("presentationCount \(dataSource.count)")

        return dataSource.count
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        let dataViewController = viewController as? TextDataViewController

        guard var currentIndex = dataViewController?.index else {
            return nil
        }

        print ("viewControllerBefore \(currentIndex)")

        if (currentIndex == 0) {
            return nil
        }

        currentIndex -= 1

        currentViewControllerIndex = currentIndex

        return detailViewControllerAt(index: currentIndex)
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        let dataViewController = viewController as? TextDataViewController

        guard var currentIndex = dataViewController?.index else {
            return nil
        }

        print ("viewControllerBefore \(currentIndex)")

        if currentIndex == dataSource.count-1 {
            return nil
        }

        currentIndex += 1

        currentViewControllerIndex = currentIndex

        return detailViewControllerAt(index: currentIndex)
    }
}

Ответы (1 шт):

Автор решения: Komdosh

pageViewController.delegate.self // error: Expression resolves to an unused property - означает, что вы обратились к полю, но ничего с ним не делаете, ни присваиваете никакой переменной, не вызываете методы и т.д.

В функции func detailViewControllerAt(index: Int) -> TextDataViewController, вам нужно указать возвращаемый тип с возможностью быть nil, за это отвечает знак вопроса ? - TextDataViewController?. Так как в теле вы возвращаете return nil, у вас происходит ошибка типизации.

→ Ссылка