考虑这个 myFilter 函数,它接受一个泛型参数并根据谓词过滤数组。这与 Swift 提供的 filter() 函数相同。

func myFilter<T>(source: [T], predicate:(T) -> Bool) -> [T] {
  var result = [T]()
  for i in source {
    if predicate(i) {
      result.append(i)
    }
  }
  return result
}

这有什么不同,
func myFilter(source: [AnyObject], predicate:(AnyObject) -> Bool) -> [AnyObject] {
  var result = [AnyObject]()
  for i in source {
    if predicate(i) {
      result.append(i)
    }
  }
  return result
}

即使在后一个例子中,我们也没有达到泛型的目的吗?

最佳答案

泛型是类型安全的,这意味着如果您将字符串作为泛型传递并尝试将其用作整数,编译器会提示并且您将无法编译您的(这很好)。 (发生这种情况是因为 Swift 使用 静态类型 ,并且能够为您提供 编译器错误 )

如果您使用 AnyObject,编译器不知道该对象是否可以被视为字符串或整数。它将允许您用它做任何您想做的事情(这很糟糕)。

例如如果您尝试在之前使用的整数时传递字符串,则应用程序将崩溃。 (发生这种情况是因为 Swift 正在使用 动态类型 并且只会给你一个 运行时崩溃 )

泛型基本上告诉编译器:



AnyObject 基本上告诉编译器:

关于ios - Swift 中泛型和 AnyObject 的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31041265/

10-16 04:25