考虑此myFilter函数,该函数采用通用参数,并根据谓词过滤数组。这与filter()Swift提供的功能相同。
myFilter
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使用的是 Static类型 ,并且能够给您一个 编译器 错误 )
如果使用AnyObject,则编译器不知道该对象是否可以视为String或Integer。它可以让您随心所欲地做(这很不好)。
例如,如果您尝试在以前使用的Integer 字符串中传递字符串 , 则应用程序将崩溃。(发生这种情况是因为Swift正在使用 动态类型输入 , 只会 给您造成 运行时 崩溃 )
泛型基本上告诉编译器:
“稍后我将为您提供一种类型,我希望您在指定的任何地方 强制执行该类型 。”
AnyObject基本上告诉编译器:
“不用担心这个变量 ,这里不需要强制执行任何类型, 让我做我想做的事。”