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