swift中任何类型和泛型类型之间有什么区别?
任何类型示例:
let swiftInt: Int = 1
let swiftString: String = "miao"
var array: [Any] = []
array.append(swiftInt)
array.append(swiftString)
通用类型示例:
func duplicate<T>(item: T, numberOfTimes n: Int) -> [T] {
var buffer : [T] = []
for _ in 0 ..< n {
buffer.append(item)
}
return buffer
}
这是一个偏好问题,因为两者似乎都可以通过替换所需的类型来解决同样的问题。
答案 0 :(得分:3)
我不打算详细解释泛型,我只是指出了本质区别。
在第一个示例中,您将能够在该数组中追加任何类型,而无法事先将数组限制为特定类型,并利用编译时检查来保证数组不包含无关类型。在那个例子中没什么可看的。
第二个示例包含一个提供上述所有功能的通用函数,对数组内容的一致性检查将免费提供,如果您希望您还能够指定该泛型类型的其他特性{ {1}},就像请求它实现特定协议一样(例如,将T
限制为实现duplicate()
或Comparable
的对象。
但这只是一个通用函数的简单示例,您还可以使用参数化类(您将使用最多的函数),还有许多其他功能。
永远不要将Equatable
用作穷人的泛型,真正的泛型更灵活,添加有用的检查并更明确地表达您的意图,只需要额外的努力来实现它们。
答案 1 :(得分:2)
Any
表示&#34;我不想要任何类型检查,而且我无法在不投标的情况下调用特定类型的方法&#34;
例如,尝试调用:
var array: [Any] = [1, 2]
var sum = array[0] + array[1] // you cannot do this! you have to cast to Int first
泛型类型是类型的占位符。使用时,使用具体类型代替它(例如Int
或String
)。
简而言之,绝不要使用Any
。 <{1}}是您想要使用的特定情况。