在 ios Swift 中声明变量的区别?

Difference between declaring a variable in ios Swift?

最近在学习Swift,发现一个变量有两种声明方式。

var indexArray = NSMutableArray()     //and
var indexArray : NSMutableArray = NSMutableArray()

我只是想知道它们之间有什么区别?它会复制任何类型的变量赋值吗?

这里简单解释一下

var indexArray = NSMutableArray()

如上所述, indexArray 变量可以是任何一个, String , Int ,......。你没有特别为该变量指定任何类型。

var indexArray : NSMutableArray = NSMutableArray()

这里你特意给出indexArray是一个NSMutableArray

您可以在声明常量或变量时提供类型注释,以明确常量或变量可以存储的值的类型。通过在常量或变量名称后放置一个冒号,然后是 space,然后是要使用的类型的名称来编写类型注释。

此示例为名为 welcomeMessage 的变量提供类型注释,以指示该变量可以存储字符串值:

 var welcomeMessage: String

声明中的冒号表示“……类型……”,因此上面的代码可以读作:

声明一个名为 welcomeMessage 的变量,它是字符串类型。

短语“of type String”的意思是“可以存储任何字符串值”。将其视为可以存储的“事物的类型”(或“事物的种类”)。

现在可以将 welcomeMessage 变量设置为任何字符串值而不会出错:

 welcomeMessage = "Hello" 

您可以在一行中定义多个相同类型的相关变量,以逗号分隔,并在最终变量名后添加一个类型注释:

var red, green, blue: Double”

*注*

实践中很少需要写类型注解。如果您在定义常量或变量时为其提供初始值,Swift 几乎总能推断出用于该常量或变量的类型,如类型安全和类型推断中所述。在上面的 welcomeMessage 示例中,没有提供初始值,因此 welcomeMessage 变量的类型是用类型注释指定的,而不是从初始值推断出来的。

Excerpt From: Apple Inc. “The Swift Programming Language (Swift 2 Prerelease).” iBooks. https://itun.es/us/k5SW7.l

在第一种情况下,indexArray 自动采用赋值源的类型,因此在您的示例中,语句完全相同。

除了第二个版本更明确之外的区别在于,在第二种情况下,您 可以 调整 indexArray 的类型 - 例如到基础 class;

var indexArray = NSMutableArray()            // indexArray is type NSMutableArray

var indexArray : NSArray = NSMutableArray()  // indexArray is type NSArray
                                             // but contains an NSMutableArray

当然,如果你声明一个变量而不赋值,你不能从赋值源中自动获取类型,所以你需要显式类型声明。

Swift 的一个重要语言特性是 类型推断 。这意味着一个变量可以根据它所赋的值来识别它的类型。

var indexArray = NSMutableArray()

通过上面的语句,隐式知道变量indexArrayNSMutableArray类型,无需指定。

而在另一种类型的声明中,

var indexArray : NSMutableArray = NSMutableArray()

您在为变量 indexArray 赋值之前明确指定其类型为 NSMutableArray。如果你给它分配不同的类型,编译器会抛出一个错误。

var indexArray : NSMutableArray = NSString() // This is wrong 

一个很好的起点是复习 Apple 的 Swift Language document

没有区别,都是一样的..

以下声明存在差异,

var welcomeMessage:字符串? - 在任何时间点都可以为 nil 或赋值为 nil

var welcomeMessage: 字符串! - 在使用该变量时任何时候都不能为 nil。

var welcomeMessage: String - 将抛出错误提示,class 没有初始值设定项

但是下面两个没有区别,

var welcomeMessage: String = String()

var welcomeMessage = String()