swift中任何类型和泛型类型之间的区别

时间:2016-07-10 16:50:57

标签: swift generics types

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
}

这是一个偏好问题,因为两者似乎都可以通过替换所需的类型来解决同样的问题。

2 个答案:

答案 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

泛型类型是类型的占位符。使用时,使用具体类型代替它(例如IntString)。

简而言之,绝不要使用Any。 <{1}}是您想要使用的特定情况。