考虑这个 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/