Swift 为什么我可以在整数协议中存储和检索数字?

Swift 为什么我可以在整数协议中存储和检索数字?,swift,Swift,我看到一些人在Swift中混淆了Integer(一种协议)和Int(一种类型)。我想我理解了它们之间的区别,并且我明白了为什么不能将Integers添加到一起。添加两个协议是没有意义的 但是,我想知道为什么这样做会奏效: var x:Integer = 3 println(x) // Prints 3 如果Integer只是一个协议,它怎么能存储和检索整数值呢?(如果它不起作用,会不会减少Swift初学者的混淆?因为3是Int,而且Int实现了整数协议,然后,var x可以很好地引用实例3如果

我看到一些人在Swift中混淆了
Integer
(一种协议)和
Int
(一种类型)。我想我理解了它们之间的区别,并且我明白了为什么不能将
Integer
s添加到一起。添加两个协议是没有意义的

但是,我想知道为什么这样做会奏效:

var x:Integer = 3
println(x) // Prints 3

如果
Integer
只是一个协议,它怎么能存储和检索整数值呢?(如果它不起作用,会不会减少Swift初学者的混淆?

因为3是
Int
,而且
Int
实现了
整数协议,然后,var x可以很好地引用实例
3

如果您只需要符合该协议的内容,那么任何变量都可以使用as作为其类型

因此,您正在分配的int值
3
被放入一个变量中,其中只有
整数协议中指定的内容(方法、运算符、属性等)可用

这对于委托之类的事情很有用,因为您并不真正关心对象的具体类型,只要它支持您需要的功能(如协议中所指定的)

这在变量x:Integer=3中有一定的深度 x:Int= 2> 变量y:Int=3 y:Int=3

这不是一回事。但是,由于
Int
实现了
Integer
,因此在某些情况下(如
println
)使用时,可能会得到有意义的结果。但不要依赖它

它确实可以工作,但取决于
Integer
协议中指定的内容,打印值可能会很奇怪,因此本质上是推断类型,但应用您显式命名的协议?@FernandoMazzon是的,编译器一直都知道类型(我相信您可以使用
.dynamicType
访问它,但不要引用我的话)但为了支持委托之类的事情,它允许您使用协议作为类型,并且(为了安全起见)只允许您使用协议中指定的变量部分。这基本上是在swift中:)啊,是的,当然我想我只是被这样一个事实蒙蔽了双眼:integer是一种如此简单的类型,我不习惯于基本(或引用看起来不像引用)的协议,并试图从九个不同的思维层次学习一门新语言:)谢谢@马特吉布森如果你能抽出时间,一定要下载WWDC应用程序并观看Swift讲座(入门、中级、高级,每个1小时)。“将swift与Objective-C集成”和“深入的swift互操作性”(也各1小时)也很有帮助,如果不是这样的话。@jiaaro编译器在将类型赋给整数后不再知道该类型
.dynamicType
是恢复具体类型的运行时操作。
  1> var x:Integer = 3
x: Int = <read memory from 0x7fd3dc465760 failed (0 of 8 bytes read)>
  2> var y:Int = 3
y: Int = 3