The Swift Programming Language6

来源:互联网 发布:sql获取当前系统时间 编辑:程序博客网 时间:2024/06/04 20:04

整型转换(Integer Conversion)

 

每种用于常量或者变量的数据类型都有其范围,Int8的常量或者变量能够存储的范围为-128到127,而UInt8的常量或者变量能够存储的范围为0到255。如果数据类型的大小不能满足相应的常量或者变量的大小需要,那么在编译时将会报错。如下:

 

“letcannotBeNegative: UInt8 = -1

// UInt8 cannotstore negative numbers, and so this will report an error

let tooBig: Int8 =Int8.max + 1

// Int8 cannotstore a number larger than its maximum value,

// and so thiswill also report an error”

 

 

由于每种数据类型能够存储不同的范围值,你得需要根据一定的准则选择数据类型的转换。这种选择转换的方式,防止了隐式数据类型的转换错误,而且使数据类型的转换意图明显

 

为了把相应的数据类型转换到其他类型,需要使用已有的数据值来初始化你所希望的数据类型的值,在下面的例子中,常量twoThousand是UInt16类型,而常量one 是UInt8。由于不是相同的数据类型,他们不能够被直接相加在一起。然而通过调用UInt16(one)用one来初始化创建的UInt16类型的数据,得到了UInt16的数据类型

 

“let twoThousand:UInt16 = 2_000

let one: UInt8 = 1

lettwoThousandAndOne = twoThousand + UInt16(one)”

 

现在加号的两边twoThousand和UInt16(one)的数据类型都是UInt16,就可以被相加,结果twoThousandAndOne被推测为UInt16数据类型,因为这两个数相加结果是UInt16

 

SomeType(ofInitialValue)是Swift一种默认的用已有值初始化新数据的方法。底层实现是UInt16有一个能接受UInt8值的初始化方法。这个初始化方式使用一个已有的UInt8来初始化刚创建的UInt16的数据。我们不能传递任意类型的数据到这个初始化方法,必须传递UInt16支持的数据。想要扩展初始化方法能接受的数据类型,请参考  Extensions章节内容

 

整型与浮点型之间的转换(Integer and Floating-Point Conversion)

 

整型和浮点型之间的转换必须是显式的标记。如下:

 

“let three = 3

letpointOneFourOneFiveNine = 0.14159

let pi =Double(three) + pointOneFourOneFiveNine

// pi equals3.14159, and is inferred to be of type Double”

 

上面的例子中使用3来创建Double型的数据,现在两边都是Double。如果不进行这样的转换,就不能进行相加。也可以把浮点型数据转换为整型数据。如下:

 

 

“let integerPi =Int(pi)

// integerPiequals 3, and is inferred to be of type Int”

 

浮点型数据转换为整型,要进行数据”切断”( truncated),例如4.75变为了4,-3.9变为-3

 

注意:

常量和变量的数据归并规则不同于数据语义规则(“rules for numericliterals”),语义上数字3能够加上0.14159,因为语义数据本身没有数据类型,是在结果被编译器计算出来后才推断其数据类型。

 

 

类型的别名(Type Aliases)

 

对于已有的数据类型,类型别名定义了一个可选的类型名字,类型别名的定义使用关键字typealias 关键字

 

在上下文中,对于已有的数据类型想使用更合适的名字来代替,那么使用类型别名就会非常有用,例如当使用来自外部的有着特定大小数据源时如下:

typealiasAudioSample = UInt16

只要定义了数据别名,就可以在任何需要原始数据类型名字的地方使用新的别名,如下:

var maxAmplitudeFound =AudioSample.min

//maxAmplitudeFound is now 0

 

AudioSample 是被定义为UInt16的别名,因为AudioSample是被定义为别名了,所以调用AudioSample.min就像调用UInt16.min一样,结果返回了0给maxAmplitudeFound

 

 

布尔变量(Booleans)

 

Swift有一个基本的布尔类型Bool,布尔类型也被称为逻辑类型,因为他们只能为真或者假,Swift提供了两种布尔常量true 和false

 let orangesAreOrange = true

 let turnipsAreDelicious = false

orangesAreOranges 和turnAreDelicious被推测为布尔类型,因为他们都是使用布尔语义的值来初始化,只要你把变量或者常量的值设置为false或者true,就不需要这个变量或者常量声明为布尔类型,类型推测能够帮助推测其相应的数据类型,

 

当需要条件语句时,布尔值是非常的有用的

“ifturnipsAreDelicious {

    println("Mmm, tasty turnips!")

} else {

    println("Eww, turnips arehorrible.")

}

// prints"Eww, turnips are horrible.”

 

条件语句例如if语句在Control Flow章节有着详细讨论

Swift的类型安全防止非布尔值代替布尔值,下面的例子将会在编译时报错

let I = 1

if  I  {

  //this example will not complie ,and willreport an error

}

 

 

 

而下面的方式是可以的

let I = 1

if  I == 1 {

  //this example will compile succesfully

}

 

I == 1 的比较返回一个布尔类型的值,因此第二个例子能够通过类型检查,像I == 1这样的比较在Basic Operators里面详细讨论

 

 

正如Swift中的类型安全的例子,类型安全避免了一些意外的错误,并保证了一些特别的代码块意图清晰

0 0
原创粉丝点击