ios - Swift 中泛型和 AnyObject 的区别

标签 ios swift functional-programming

考虑这个 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 使用动态类型并且只会给你一个运行时崩溃)

泛型基本上告诉编译器:

"I am going to give you a type later and I want you to enforce that type everywhere I specify."

AnyObject 基本上告诉编译器:

"Don't worry about this variable no need to enforce any type here let me do whatever I want to."

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

相关文章:

ios - 删除当前位置 xCode6 Swift

iphone - 如何修复 iOS 11 搜索栏在选择时跳转到屏幕顶部 (Swift)?

ios - ViewController 始终加载相同的链接

javascript - 我应该如何在小函数之间传递数据 - 通过闭包或通过对象的属性?

ios - 在 Objective-C block 中修改全局变量

ios - 将外部字体导入 iPhone 应用程序

iphone - 重命名 Settings.bundle 而不是 Bundle 显示名称?

ios - Swift 3 发布后,Swift 2 应用程序可以正常运行吗?

compiler-construction - 在按名称调用和按值调用下会打印什么?

python - 装饰器 : TypeError: "got multiple values for keyword argument <variable name>" on function call