苹果新的编程语言 Swift 语言进阶(二)--基本数据类型
一 、 常量和变量
Swift语言 对常量和变量的声明进行了明确的区分
let maximumNumberOfLoginAttempts =10Swift语言的常量类型比C 语言的constants类型更加强大,语义更加明确。
常量和变量的区别是常量在设置或初始化后其值不允许改变,而变量允许,除此之外,Swift语言中变量类型能使用的地方,常量类型也同样能使用,如作为输入参数等。
Swift语言中常量类型使用let 关键字进行声明,变量类型使用var 关键字进行声明,如
var currentLoginAttempt =0
以上语句声明了一个名字为maximumNumberOfLoginAttempts的常量,其值为10;接着又声明了一个名字为currentLoginAttempt的变量,其初始值为0。
如果一行中只有一条语句,语句最后就不需要带分号,如果一行中带有多条语句,语句之间就需要加分号,而最后一条不需要,这也体现和反应了Swift语言语法设计简洁和明确的思想。如以下语句所示:
在Swift中常量和变量可以是任何类型。当声明一个常量或一个变量时,你可以为其提供一个类型标识,来清楚表示该常量或变量的类型。 声明语法是在常量和变量名字后面跟着一个冒号,接着跟着类型的名字。如下所示声明了一个类型为字符串类型(String)名字为welcomeMessage的变量。let cat = ""; println(cat)
var welcomeMessage: String
在作了以上声明后,welcomeMessage变量就可以设置为任何字符串值,如:
welcomeMessage = “Hello"
实际上你很少需要为一个变量声明或常量声明指定类型。如上面的对maximumNumberOfLoginAttempts常量和currentLoginAttempt变量的声明,Swift编译器能够根据声明中提供的初始值自动推断其为Int类型。
如下语句Swift推断你想创建一个Double类型的常量。
let pi =3.14159
二、多样化的数字表示。因次当你定义一个常量或变量时为其提供了一个初始值,就不再需要另外为其指定类型,Swift编译器可以从中推断出其类型。
Swift支持以8位、16位、32, 和64 位形式来表达一个有符号和无符号形式的整数类型。整数类型的命名遵从和C语言相似的约定,如UInt8代表一个8位无符号整数,Int32代表一个32位有符号整数,Swift建议你通常使用Swift定义的一个位数和和当前平台的本地字大小相同的Int整数类型,这样可以保持代码的一致性和互操作性,避免了不同整数类型之间的相互转换。
Swift中整型常量数字的表达可以使用十进制、二进制、八进制、十六进制等多种形式:
let decimalInteger = 17 //十进制表达(没有前缀)
let binaryInteger = 0b10001 // 二进制表达(0b开头)
let octalInteger = 0o21 // 八进制表达(0o开头)
let hexadecimalInteger = 0x11 // 十六进制表达(0x开头)
Swift也提供Double(64位)和Float(32位)两种形式的浮点数支持。
Swift中,浮点数常量数字的表达支持十进制(没有前缀)或十六进制(0x开头)两种形式,并支持不同的指数形式。如下所示:
1.25e2 means 1.25 × 102, or125.0. 十进制表达形式(不带前缀,指数用大小写的e来指示)
0xFp2 means 15 × 22, or60.0. 十六进制表达形式(以0x开头,指数用大小写的p来指示)
Swift中,为了使数字表达更加易读和自然,数字表达格式还能包含额外的信息,如整数和浮点数都能在前面添加额外的0以及在数字之间包含下划线。如下所示:
let paddedDouble = 000123.456
let oneMillion = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1
三、 多元组
多元组(Tuples)是Swift语言提供的一种新的数据类型,是一种多个数值的组合。一个多元组可以是任意类型甚至是不同类型数值的组合。
如下所示:
let http404Error = (404,"Not Found")
该例子定义了一个描述HTTP状态码的多元组常量http404Error,该常量的类型为(Int, String)的多元组类型,其值为(404, "Not Found")。该多元组表示了一个整数和一个字符串的组合。
当使用时,你可以从多元组中分解出每个分离的值。如下语句所示:
let (statusCode,statusMessage) =http404Error
println("The status code is\(statusCode)")
// prints "The status code is 404"
println("The status message is\(statusMessage)")
// prints "The status message is Not Found"
当你仅需要多元组的部分值时,可以使用符合‘_’来指示忽略的其它项:
let (justTheStatusCode,_) =http404Error
println("The status code is\(justTheStatusCode)")
// prints "The status code is 404"
另外还可以使用索引来存取一个多元组中的每个独立的项:
println("The status code is\(http404Error.0)")
// prints "The status code is 404"
println("The status message is\(http404Error.1)")
// prints "The status message is Not Found"
当多元组定义时你还可以为多元组中的每一个独立项命名:
let http200Status = (statusCode:200,description:“OK")
然后你可以使用命名的元素名来存取这些元素的值:
println("The status code is\(http200Status.statusCode)")
// prints "The status code is 200"
println("The status message is\(http200Status.description)")
// prints "The status message is OK”
四 、选项类型:
多元组主要用于函数的返回值,如果一个函数需要返回多个值,如一个函数需要返回上面描述的HTTP状态码,就可以定义和返回一个上面描述的的多元组。
多元组类型提供了一种简洁的方式使一个函数可以返回多个不同类型的返回值。
多元组适合于创建相关值的临时组合,而不适合于创建复杂的数据结构。
与选项类型能力最接近的是Objective-C语言中的一个可能返回一个对象,也可能返回一个nil的方法的使用。在Objective-C语言中nil意味着一个有效对象的不存在,但在Objective-C语言中nil仅能够工作于对象,而不能工作于结构以及其它基本C类型或者枚举类型。 对于这些类型值的不存在Objective-C语言用一个NSNotFound特殊值表示。
选项类型是Swift语言提供的又一种强大的新的数据类型,用来表达一个可能存在也可能不存在的值类型。
而Swift的选项类型可以指示任何类型值的不存在,而不需要另外定义任何其它特殊值。
如一个字符串类型可以使用其方法toInt来转换一个字符串的值为一个整数,可是,不是每一个字符串都能够转换为一个整数。如含有数字的字符串如"123" 可以进行转换,而不含数字的字符串如"hello, world" 则不能转换。这种情况如果使用选项类型就非常有用。
如例子:
let possibleNumber ="123"
let convertedNumber =possibleNumber.toInt()
由于toInt方法可能失败,因此编译器推断possibleNumber.toInt()返回的是一个optional Int类型。一个 optional Int 类型在语法上写作:Int?。选项类型的变量或常量指示该常量或变量允许没有值。
‘?’标识符指示该值是一个选项类型,意味着该类型值可以包含有效的整数值,也可能什么值也没有包含。
Swift中你可以使用if语句来判断一个选项是否包含一个值。如果一个选项包含一个值,它被评估为true,否则评估为false。如果使用if语句评估一个选项包含了一个值,然后就能够在选项名字后面添加一个!来获取该选项的值。这在Swift语言中称作选项值的强制展开。
如下例子展示了如何强制展开一个选项值:
ifconvertedNumber{
println("\(possibleNumber) has an integer value of \(convertedNumber!)")
}else {
println("\(possibleNumber) could not be converted to an integer")
}
需要强调的是,如果试图使用!来存取一个不存在的选项值会触发一个运行时错误,因此在使用!来存取选项值之前应该总是确保该选项值包含一个有效值,或者采用上面的方式进行判断。
Swift中你还能够使用选项绑定来判断一个选项是否包含一个有效值。选项绑定作为if 或while语句的判断语句使用,在判断语句中先取出选项中的值并赋值给一个常量或变量,然后使用该常量或变量来检查和使用该选项中的值。
如下例子展示了如何使用选项绑定来使用一个选项中的值。
ifletactualNumber = possibleNumber.toInt() {
println("\(possibleNumber) has an integer value of \(actualNumber)")
}else {
println("\(possibleNumber) could not be converted to an integer")
}
你可以通过为一个选项变量赋值为nil,来设置该选项变量为一个无值的状态:
var serverResponseCode: Int? = 404
选项变量serverResponseCode 包含一个实际的整数值404.
serverResponseCode = nil
现在serverResponseCode不包含值。
如果你定义一个选项常量或变量,但没有为其提供默认值,该常量或变量自动被设置为nil。
nil在Objective-C是一个代表不存在对象的指针,而在Swift中它代表一个确定类型值的不存在,并且在Swift中任意类型 的选项都可以设置为nil,而不仅仅是对象类型。
一个选项类型在首次设置时,如果为其设置了一个有效值,由于这时选项类型的值程序是清楚的,并且如果在此后使用该选项的每个地方也能够确信该选项的值存在,这种类型的选项就可以定义为一个称为隐含的已展开的选项。
一个隐含的已展开的选项在使用时不再需要使用条件语句来检查以及使用强制展开或选项绑定来取出选项中的值。
你在选项类型的常量或变量后面放置一个‘!’符号标识来指示该选项是一个隐含的已展开的选项。
隐含的已展开的选项通常在类的初始化期间使用。
如下展示了如何定义一个隐含的已展开的选项及如何使用它:
letassumedString:String! ="An implicitly unwrapped optional string."
println(assumedString)
// no exclamation mark is needed to access its value
当然需要注意的是如果试图存取一个不包含值的隐含的已展开的选项,仍然会触发一个运行时错误。
版权所有,请转载时注明链接和出处,谢谢!