【问题标题】:swift indexOf for [AnyObject] array[AnyObject] 数组的快速 indexOf
【发布时间】:2015-08-19 12:19:34
【问题描述】:

试图获取数组的索引 ([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
  }

【问题讨论】:

  • 也许换个方式试试,将self.viewControllers 转换为[UIViewController]
  • @Aderstedt:我收到了:Cannot invoke 'indexOf' with an argument list of type '(AnyObject?)'。有什么想法吗?
  • 通常,错误消息中的问号很重要。

标签: ios arrays swift equatable


【解决方案1】:

我们需要将我们正在测试的对象转换为UIViewController,因为我们知道controllers 的数组持有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 类实现)。

【讨论】:

    【解决方案2】:

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

    if let controllers = self.viewControllers as? [UIViewController] {
        self.nextIndex = controllers.indexOf(controller)
    }
    

    【讨论】:

    • @nhgrif 为什么会很贵?
    • 抱歉...如果self.viewControllers 尚未声明为[UIViewController](从问题中不清楚),则可能需要此特定部分。但是您错过了我们需要将controller 转换为UIViewController 的部分,正如我的回答所描述的那样。
    • 实际上,在第二次阅读问题时,完全没有必要强制转换数组本身。查看正在使用的indexOf 的实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多