一尘不染

Swift中泛型和AnyObject之间的区别

swift

考虑此myFilter函数,该函数采用通用参数,并根据谓词过滤数组。这与filter()Swift提供的功能相同。

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
}

即使在后面的示例中,我们也无法达到泛型的意义吗?


阅读 324

收藏
2020-07-07

共1个答案

一尘不染

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

如果使用AnyObject,则编译器不知道该对象是否可以视为String或Integer。它可以让您随心所欲地做(这很不好)。

例如,如果您尝试在以前使用的Integer 字符串中传递字符串 则应用程序将崩溃。(发生这种情况是因为Swift正在使用 动态类型输入
只会 给您造成 运行时 崩溃

泛型基本上告诉编译器:

“稍后我将为您提供一种类型,我希望您在指定的任何地方 强制执行该类型 。”

AnyObject基本上告诉编译器:

“不用担心这个变量 ,这里不需要强制执行任何类型, 让我做我想做的事。”

2020-07-07