【问题标题】:The difference between an any type and a generic type in swiftswift中任意类型和泛型类型的区别
【发布时间】:2016-11-12 15:38:44
【问题描述】:

swift 中的 any 类型和泛型类型有什么区别?

任何类型示例:

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
}

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

【问题讨论】:

  • 简短地说:第一个数组可以包含String Int。第二个数组可以包含String Int

标签: swift generics types


【解决方案1】:

Any 的意思是“我不想要任何类型检查,而且如果不进行强制转换,我将无法调用特定于类型的方法”

例如,尝试调用:

var array: [Any] = [1, 2]
var sum = array[0] + array[1] // you cannot do this! you have to cast to Int first

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

简而言之,永远不要使用AnyAny 是您想要使用的特定情况。

【讨论】:

  • 当您说“具体类型”@Sulthan 时,您指的是仅整数、字符串、双精度、数组等,而不是自定义类型(例如从自定义类创建的类型)?听起来泛型更是如此,因为如果您在编程时事先不知道类型是什么,那么这是一个准确的说法吗?
  • 具体类型是您在使用通用(也称为参数)函数/类时选择使用的类型。它可以是任何东西,也可以是您的自定义类/结构之一。
【解决方案2】:

我不打算详细解释泛型,我只会指出本质上的区别。

在第一个示例中,您将能够在该数组中附加任何类型,而无需事先将您的数组限制为特定类型并利用编译时检查来保证数组不会包含无关的类型。在那个例子中没什么可看的。

第二个示例包含一个提供上述所有功能的泛型函数,对数组内容的一致性检查将免费提供,如果您愿意,您还可以指定该泛型类型的其他特征@ 987654321@,比如请求它实现一个特定的协议(例如限制duplicate() 到实现ComparableEquatable 的对象)。

但这只是泛型函数的一个简单示例,您还可以拥有参数化类(您将使用最多的类),并且还有很多附加功能。

永远不要将Any 用作穷人的泛型,真正的泛型更灵活,添加有用的检查并更明确地表达您的意图,实现它们所需的额外工作量最少。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2017-07-27
    相关资源
    最近更新 更多