考虑此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
}
即使在后面的示例中,我们也无法达到泛型的意义吗?
泛型是类型安全的,这意味着如果您将字符串作为泛型传递并尝试将其用作整数,则编译器会抱怨并且您将无法编译您的(很好)。(发生这种情况是因为Swift使用的是
Static类型 ,并且能够给您一个 编译器 错误 )
如果使用AnyObject,则编译器不知道该对象是否可以视为String或Integer。它可以让您随心所欲地做(这很不好)。
例如,如果您尝试在以前使用的Integer 字符串中传递字符串 , 则应用程序将崩溃。(发生这种情况是因为Swift正在使用 动态类型输入 ,
只会 给您造成 运行时 崩溃 )
泛型基本上告诉编译器:
“稍后我将为您提供一种类型,我希望您在指定的任何地方 强制执行该类型 。”
AnyObject基本上告诉编译器:
“不用担心这个变量 ,这里不需要强制执行任何类型, 让我做我想做的事。”
问题内容: 如标题所示,Array vs NSArray vs [AnyObject]有什么区别? 另外,最推荐的解决方法。我的意思是建议最简单的实现是什么。谢谢。 问题答案: 是 struct ,因此它是Swift中的 值类型 。 是一个不变的Objective C 类 ,因此它是Swift中的 引用类型 ,并桥接到。 是的可变子类。 印刷品: 因为更改的局部值并更改参考。如果您这样做而不是像其
问题内容: 我不明白何时在Swift中使用AnyObject以及何时使用Any。 就我而言,我有字典 [字串:???] ??? :可以是Int,Double,Float,String,Array,Dictionary 有人可以向我解释Any和AnyObject之间的区别以及在我的情况下使用哪个。 阿拉克 问题答案: 仅适用于引用类型(类),适用于值和引用类型。 所以你应该去。 类型转换为Any和A
问题内容: Java具有泛型,而通过提供了非常强大的编程模型。那么,和Java泛型之间有什么区别? 问题答案: 它们之间有很大的区别。在C ++中,您不必为泛型类型指定类或接口。这就是为什么您可以创建真正的泛型函数和类,而不必担心键入错误。 上面的方法添加了两个相同类型的对象,并且可以用于具有“ +”运算符的任何类型T。 在Java中,如果要在传递的对象上调用方法,则必须指定一种类型,例如: 在C
问题内容: 在 Swift 4.1中 似乎已弃用。但是在 Swift 4.1中 有一个新方法正在做同样的事情?有了它,您可以变换集合中的每个对象,然后删除所有为零的项目。 像flatMap一样 像compactMap 在做同样的事情。 这两种方法有什么区别?苹果为何决定重命名该方法? 问题答案: Swift标准库为函数定义了3个重载: 可以通过两种方式滥用最后一个重载函数: 考虑以下struct和
本文向大家介绍swift中AnyObject和Any的介绍与区别详解,包括了swift中AnyObject和Any的介绍与区别详解的使用技巧和注意事项,需要的朋友参考一下 诞生 swift 作为新起步的语言,必然抛不掉一些历史遗留包袱。用过 Objective-C 的同学肯定知道有一种叫做 id 的类型。他可以表示任意类的实例,编译器不会对其类型声明的变量进行检查。在用 swift 做 app 开
问题内容: 我正在使用Eclipse来帮助我清理一些代码以正确使用Java泛型。大多数时候,它在推断类型方面做得非常出色,但是在某些情况下,推断类型必须尽可能地通用:对象。但是Eclipse似乎给了我一个选择,可以选择对象类型还是“?”类型。 那么两者之间有什么区别? 和 问题答案: 匹配项的实例,但不是。假设您要编写一个接受Strings到任何内容的映射的方法:如果您要编写 您无法提供。如果你写