add list, modify a to -3

This commit is contained in:
lyuka
2014-06-06 20:29:32 +08:00
parent c40ac9b40e
commit e6ca8102de

View File

@ -96,14 +96,14 @@ Swift 是一个类型安全的语言可选就是一个很好的例子。Swift
let languageName = "Swift"
languageName = "Swift++"
// this is a compile-time error - languageName cannot be changed
### 输出常量和变量
你可以用`println`函数来输出当前常量或变量的值:
println(friendlyWelcome)
// prints "Bonjour!"
`println`是一个用来输出的全局函数输出的内容会在最后带换行。如果你用Xcode`println`将会输出内容到“console”面板上。(另一种函数叫`print`,唯一区别是在输出内容最后不会加入换行。)
`println`函数输出传入的`String`值:
@ -117,7 +117,7 @@ Swift用字符串插值string interpolation的方式把常量名或者变
println("The current value of friendlyWelcome is \(friendlyWelcome)")
// prints "The current value of friendlyWelcome is Bonjour!
> 注意:字符串插值所有可用的选项在 字符串插值 这章中讲述。
### 注释
@ -131,9 +131,9 @@ Swift 中的注释与C 语言的注释非常相似。单行注释以双正斜杠
/* this is also a comment,
but written over multiple lines */
与C 语言多行注释不同的是Swift 的多行注释可以嵌套在其它的多行注释之中。你可以先生成一个多行注释块,然后在这个注释块之中再嵌套成第二个多行注释。终止注释时先插入第二个注释块的终止标记,然后再插入第一个注释块的终止标记:
/* this is the start of the first multiline comment
/* this is the second, nested multiline comment */
this is the end of the first multiline comment */
@ -145,4 +145,164 @@ Swift 中的注释与C 语言的注释非常相似。单行注释以双正斜杠
let cat = "🐱"; println(cat)
// prints "🐱"
<<<<<<< HEAD
## 整数
整数就是没有小数部分的数字比如`42``-23`整数可以是有符号或者无符号)。
Swift 提供了81632和64位的有符号和无符号整数类型这些整数类型和 C 语言的命名方式很像比如8位无符号整数类型是`UInt8`32位有符号整数类型是`Int32`就像 Swift 的其他类型一样整数类型采用大写命名法
### 整数范围
你可以访问不同整数类型的`min``max`属性来获取对应类型的最大值和最小值
let minValue = UInt8.min // minValue 0 UInt8 类型的最小值
let maxValue = UInt8.max // maxValue 255 UInt8 类型的最大值
### Int
一般来说你不需要专门指定整数的长度Swift 提供了一个特殊的整数类型`Int`长度与当前平台的原生字长相同
* 在32位平台上`Int``Int32`长度相同
* 在64位平台上`Int``Int64`长度相同
除非你需要特定长度的整数一般来说使用`Int`就够了这可以提高代码一致性和可复用性即使是在32位平台上`Int`可以存储的整数范围也可以达到`-2147483648`~`2147483647`大多数时候这已经足够大了
### UInt
Swift 也提供了一个特殊的无符号类型`UInt`长度与当前平台的原生字长相同
* 在32位平台上`UInt``UInt32`长度相同
* 在64位平台上`UInt``UInt64`长度相同
> 注意:尽量不要使用`UInt`,除非你真的需要存储一个和当前平台原生字长相同的无符号整数。除了这种情况,最好使用`Int`,即使你要存储的值已知是非负的。统一使用`Int`可以提高代码的可复用性,避免不同类型数字之间的转换,并且匹配数字的类型推测,详情参见[类型安全和类型推测](## 类型安全和类型推测)。
## 浮点数
浮点数是有小数部分的数字比如`3.14159``0.1``-273.15`
浮点类型比整数类型表示的范围更大可以存储比`Int`类型更大或者更小的数字Swift 提供了两种有符号浮点数类型
* `Double`表示64位浮点数当你需要存储很大或者很高精度的浮点数时请使用此类型
* `Float`表示32位浮点数精度要求不高的话可以使用此类型
> 注意:`Double`精确度很高至少有15位数字而`Float`最少只有6位数字。选择哪个类型取决于你的代码需要处理的数字大小。
## 类型安全和类型推测
Swift 是一个类型安全的语言类型安全的语言可以让你清楚地知道代码要处理的值的类型如果你的代码需要一个`String`你绝对不可能不小心传进去一个`Int`
Swift 是类型安全的会在编译你的代码时进行类型检查如果遇到不匹配的类型会报错这可以让你在开发的时候尽早发现并修复错误
当你要处理不同类型的值时类型检查可以帮你避免错误然而这并不是说你每次声明常量和变量的时候都需要显式指定类型如果你没有显式指定类型Swift 会使用类型推测来选择合适的类型有了类型推测编译器可以在编译代码的时候自动推测出表达式的类型原理很简单判断你赋的值即可
因为有类型推测 C 或者 Objc 比起来 Swift 很少需要声明类型常量和变量虽然需要明确类型但是大部分工作并不需要你自己来完成
当你声明常量或者变量并赋初值的时候类型推测非常有用当你在声明常量或者变量的时候赋给它们一个原始值即可触发类型推测。(原始值就是会直接出现在你代码中的值比如`42``3.14159`。)
举个例子如果你给一个新常量赋值`42`并且没有标明类型Swift 可以推测出常量类型是`Int`因为你给它赋的初值看起来很像一个整数
let meaningOfLife = 42
// meaningOfLife 会被推测为 Int 类型
同理如果你没有给浮点原始值标明类型Swift 会推测你想要的是`Double`
let pi = 3.14159
// pi 会被推测为 Double 类型
当推测浮点数的类型时Swift 总是会选择`Double`而不是`Float`
如果表达式中同时出现了整数和浮点数会被推测为`Double`类型
let anotherPi = 3 + 0.14159
// anotherPi 会被推测为 Double 类型
原始值`3`没有显式声明类型而表达式中出现了一个浮点原始值所以表达式会被推测为`Double`类型
## 数值类原始值
整数原始值可以被写作
* 一个十进制数没有前缀
* 一个二进制数前缀是`0b`
* 一个八进制数前缀是`0o`
* 一个十六进制数前缀是`0x`
下面的所有整数原始值的十进制值都是`17`:
let decimalInteger = 17
let binaryInteger = 0b10001 // 二进制的17
let octalInteger = 0o21 // 八进制的17
let hexadecimalInteger = 0x11 // 十六机制的17
浮点原始值可以是十进制没有前缀或者是十六进制前缀是`0x`)。小数点两边必须有至少一个十进制数字或者是十六进制的数字)。浮点原始值还有一个可选的指数在十进制浮点数中通过大写或者小写的`e`来指定在十六进制浮点数中通过大写或者小写的`p`来指定
如果一个十进制数的指数为`exp`那这个数相当于基数和10^exp的乘积
* 1.25e2 表示 1.25 × 10^2等于 125.0
* 1.25e-2 表示 1.25 × 10^-2等于 0.0125
如果一个十六进制数的指数为`exp`那这个数相当于基数和2^exp的乘积
* 0xFp2 表示 15 × 2^2等于 60.0
* 0xFp-2 表示 15 × 2^-2等于 3.75
下面的这些浮点原始值都等于十进制的`12.1875`
let decimalDouble = 12.1875
let exponentDouble = 1.21875e1
let hexadecimalDouble = 0xC.3p0
数值类原始值可以包括额外的格式来增强可读性整数和浮点数都可以添加额外的零并且包含下划线并不会影响原始值
let paddedDouble = 000123.456
let oneMillion = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1
## 数值类型转换
通常来讲即使代码中的整数常量和变量已知非负也请使用`Int`类型总是使用默认的整数类型可以保证你的整数常量和变量可以直接被复用并且可以匹配整数类原始值的类型推测
只有在必要的时候才使用其他整数类型比如要处理外部的长度明确的数据或者为了优化性能内存占用等等使用显式指定长度的类型可以及时发现值溢出并且可以暗示正在处理特殊数据
### 整数转换
不同整数类型的变量和常量可以存储不同大小的数字`Int8`类型的常量或者变量可以存储的数字范围是`-128`~`127``UInt8`类型的常量或者变量能存储的数字范围是`0`~`255`如果数字超出了常量或者变量可存储的范围编译的时候会报错
let cannotBeNegative: UInt8 = -1
// UInt8 类型不能存储负数所以会报错
let tooBig: Int8 = Int8.max + 1
// Int8 类型不能存储超过最大值的数所以会报错
因为每一个整数类型都可以存储不同范围的值你必须根据情况来选择不同的转换方法不同的转换方法可以暴露出隐藏的转换错误并让你的代码更加清晰
要将一种数字类型转换成另一种你要用当前值来初始化一个新数字这个数字的类型就是你的目标类型在下面的例子中常量`twoThousand`类型是`UInt16`然而常量`one`类型是`Uint8`它们不能直接相加因为它们类型不同所以要调用`UInt16(one)`来创建一个新的`UInt16`数字并用`one`的值来初始化然后使用这个新数字来计算
let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)
现在两个数字的类型都是`UInt16`可以进行相加目标常量`twoThousandAndOne`的类型被推测为`UInt16`因为它是两个`UInt16`值的合
`SomeType(ofInitialValue)`是调用 Swift 构造器并传入一个初始值的默认方法在语言内部`UInt16`有一个构造器可以接受一个`UInt8`类型的值所以这个构造器可以用现有的`UInt8`来创建一个新的`UInt16`注意你并不能传入任意类型的值只能传入`UInt16`内部有对应构造器的值不过你可以扩展现有的类型来让它可以接收其他类型的值包括自定义类型详情参见`扩展(链接待添加)`.
### 整数和浮点数转换
整数和浮点数的转换必须显式指定类型
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi 等于 3.14159所以被推测为 Double 类型
这个例子中常量`three`的值被用来创建一个`Double`类型的值所以加号两边的数类型相同如果不进行转换两者无法相加
浮点数转换为整数也一样整数类型可以用`Double`或者`Float`类型来初始化
let integerPi = Int(pi)
// integerPi 等于 3所以被推测为 Int 类型
当用这种方式来初始化一个新的整数值时浮点值会被截断也就是说`4.75`会变成`4``-3.9`会变成`-3`
> 注意:结合数字类常量和变量不同于结合数字类原始值。原始值`3`可以直接和原始值`0.14159`相加,因为数字原始值本身没有明确的类型。它们的类型只在编译器需要求值的时候被推测。
=======