4

试图获取数组的索引 ( [AnyObject])。我缺少的部分是什么?

extension PageViewController : UIPageViewControllerDelegate {
      func pageViewController(pageViewController: UIPageViewController, willTransitionToViewControllers pendingViewControllers: [AnyObject]) {
        let controller: AnyObject? = pendingViewControllers.first as AnyObject?
        self.nextIndex = self.viewControllers.indexOf(controller) as Int?
      }
    }

我已经尝试过使用 Swift 1.2 这种方法:

func indexOf<U: Equatable>(object: U) -> Int? {
    for (idx, objectToCompare) in enumerate(self) {
      if let to = objectToCompare as? U {
        if object == to {
          return idx
        }
      }
    }
    return nil
  }

键入“任何对象?”  不符合协议'Equatable' 无法分配给“Int”类型的不可变值?

4

2 回答 2

5

我们需要将我们正在测试的对象转换为 a UIViewController,因为我们知道数组 ofcontrollers正在持有UIViewControllers (并且我们知道UIViewControllers 符合Equatable.

extension PageViewController : UIPageViewControllerDelegate {
    func pageViewController(pageViewController: UIPageViewController, willTransitionToViewControllers pendingViewControllers: [AnyObject]) {
        if let controller = pendingViewControllers.first as? UIViewController {
            self.nextIndex = self.viewControllers.indexOf(controller)
        }
    }
}

错误背后的逻辑是,为了让该indexOf方法比较您传入的对象,它必须使用==运算符比较它们。协议指定类已经实现了这个Equatable函数,所以这就是indexOf它的参数必须符合的。

Objective-C 没有相同的要求,但实际的 Objective-C 实现最终意味着使用该isEqual:方法将参数与数组中的对象进行比较(NSObject因此所有 Objective-C 类都实现了该方法)。

于 2015-08-19T12:42:04.747 回答
0

您必须将 viewController 属性转换为 Array 对象:

if let controllers = self.viewControllers as? [UIViewController] {
    self.nextIndex = controllers.indexOf(controller)
}
于 2015-08-19T12:36:06.067 回答