变量常量,注释,分号,整数,浮点数。数值行类型转换,类型别名,波尔值,元组,可选,断言
 
 
 
// 
   
 
   // 
     main.swift
 
   // 
     swift1
 
   // 
   
 
   // 
     Created by tqh on 15/6/8.
 
   // 
     Copyright (c) 2015年 tqh. All rights reserved.
 
   //
 
   
import Foundation 
   

println( 
   " 
   Hello, World! 
   ") 
   

/* 
   *
*  常量和变量
 
   */ 
   


// 
   1.声明常量和变量 
   
let maximumNumberOfLoginAttempts =  
   10  
   // 
   常量,不能重新赋值 
   
var currentLoginAttempt =  
   0            
   // 
   变量,可改变 
   
 
   
var x =  
   0.0,y =  
   0.0,z =  
   0.0   
   // 
    一行中声明多个常量或者多个变量

 
   // 
   注意:如果你的代码中有不需要改变的值,请使用 let 关键字将它声明为常量。只将需要 改变的值声明为变量。

 
   // 
   2.类型标注

 
   // 
   当你声明常量或者变量的时候可以加上类型标注(type annotation),说明常量或者变量中要存储的值的类型。

 
   // 
   声明一个类型为 String,名字为 welcomeMessage 的变量。 
   
var welcomeMessage : String  
   // 
   如果要添加类型标注,需要在常量或者变量名后面加上一个冒号和空格,然后加上类型名称。 
   
 
   
welcomeMessage =  
   " 
   hello 
   "  
   // 
   (一般来说你很少需要写类型标注。)

 
   // 
   3.常量和变量的命名

 
   // 
   你可以用任何你喜欢的字符作为常量和变量名,包括 Unicode 字符(不能将常量与变量进行互转)
 
   // 
   常量与变量名不能包含数学符号,箭头,保留的(或者非法的)Unicode 码位,连线与制表符。也不能以数字开头,但是可以在常量与变量名的其他地方包含数字。 
   
let n =  
   3.14159 
   
let 你好 =  
   " 
   你好世界 
   " 
   
let ??? =  
   " 
   haha 
   "  
   // 
   (可以用中文问号)

 
   // 
   4.输出常量和变量 
   
 
   
println(welcomeMessage)  
   // 
   索引不出来 输出"hello" 
   
println( 
   " 
   haha 
   ") 
   
println( 
   " 
   The curr ent value of f riend lyWel come is \(welcomeMessage) 
   ") 
   // 
   将常量或变量名放入圆括 号中,并在开括号前使用反斜杠将其转义: 
   
 
   
/* 
   *
*  注释
 
   */ 
   

// 
   这是一个注释 
   
 
   
/* 
    这是一个
多行注释  
   */ 
   

/* 
   这是一个多行注释的开头
/*这是第二个被嵌套的多行注释 
   */ 
   
这是一个多行注释的结尾(嵌套注释)*/ 
   


/* 
   *
*  分号(有一种情况下必须要用分号,即你打算在同一行内写多条独立的语句:)
 
   */ 
   

let cat =  
   " 
   ? ??? 
   "; println( cat)  
   // 
    输出 "????" 
   
 
   
/* 
   *
*  整数
 
   */ 
   

// 
   整数范围 
   
 
   
let minValue = UInt8.min  
   // 
    minValue 为 0,是 UInt8 类型的最小值 
   
let maxValue = UInt8.max  
   // 
    maxValue 为 255,是 UInt8 类型的最大值 
   
 
   
/* 
   *
*  浮点数 (注意:Double 精确度很高,至少有 15 位数字,而 Float 最少只有 6 位数字。选择哪个类型取决于你的代码需要处理的值的范围。)
 
   */ 
   

// 
   - Double 表示 64 位浮点数。当你需要存储很大或者很高精度的浮点数时请使用此类型。
 
   // 
   - Float 表示 32 位浮点数。精度要求不高的话可以使用此类型。 
   
 
   
/* 
   *
*  类型安全和类型推测
 
   */ 
   

/* 
   *
*  数值型字面量
 
   */ 
   

// 
   - 一个十进制数,没有前缀
 
   // 
   - 一个二进制数,前缀是 0b 
 
   // 
   - 一个八进制数,前缀是 0o
 
   // 
     - 一个十六进制数,前缀是 0x 
   
 
   
let decimalInteger =  
   17 
   
let binaryInteger = 0b10001  
   // 
    二进制的 17 
   
let octalInteger = 0o21  
   // 
    八进制的 17 
   
let hexadecimalInteger =  
   0x11  
   // 
    十六进制的 17 
   
 
   
/* 
   
如果一个十进制数的指数为 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 
   

/* 
   *
*  数值类型转换
 
   */ 
   

// 
   1.整数转换

 
   // 
   let cannotBeNegative: UInt 8 = - 1
 
   // 
    UInt8 类型不能存储负数,所以会报错
 
   // 
   let tooBig: Int8 = Int8.max + 1
 
   // 
    Int8 类型不能存储超过最大值的数,所以会报错 
   
 
   
let twoThousand: UInt16 = 2_000 
   
let one: UInt8 =  
   1 
   
let twoThousandAndOne = twoThousand + UInt16(one) 
   

// 
   2.整数和浮点数转换 
   
 
   
let three =  
   3 
   
let pointOneFourOneFiveNine =  
   014159 
   
let pi = Double(three) + Double(pointOneFourOneFiveNine)  
   // 
   照着教程的只写一个Double怎么不行 
   
let integerPi = Int(pi) 
   

/* 
   *
*  类型别名
 
   */ 
   

// 
   类型别名(type aliases)就是给现有类型定义另一个名字。你可以使用 typealias 关键字来定 义类型别名。 
   
 
   
typealias AudioSample = UInt16 
   

var maxAmplitudeFound = AudioSample.min  
   // 
   定义了一个类型别名之后,你可以在任何使用原始名的地方使用别名: 
   
 
   

/* 
   *
*  布尔值
 
   */ 
   

let orangesAreOrange =  
   true 
   
let turnipsAreDelicious =  
   false 
   

if turnipsAreDelicious { 
   
    println( 
   " 
   Mmm, tasty turnips! 
   ") 
   
}  
   else { 
   
    println( 
   " 
   Eww, turnips are horrible. 
   ") 
   
} 
   

/* 
   *
*  元组(元组在临时组织值的时候很有用)
 
   */ 
   

let http404Error = ( 
   404,  
   " 
   Not Found 
   ") 
   // 
   这个元组可以被描述为“一个类型为(Int, String)的 元组”。 
   
 
   
let (statusCode, statusMessage) = http404Error 
   
println ( 
   " 
   The stat us c ode i s \(statusCode)  
   ") 
   
// 
    输出 "The status code is 404" 
   
println ( 
   " 
   The stat us m essag e is \(statusMessage ) 
   ") 
   
// 
    输出 "The status message is Not Found"

 
   // 
   如果你只需要一部分元组值,分解的时候可以把要忽略的部分用下划线(_)标记: 
   
let (justTheStatusCode, _) = http404Error 
   
println ( 
   " 
   The stat us c ode i s \(justTheStatusCode) 
   ") 
   
  
   // 
    输出 "The status code is 404" 
   
 
   
 println ( 
   " 
   The stat us c ode i s \(http404Error.0) 
   " ) 
   
// 
    输出 "The status code is 404" 
   
 println ( 
   " 
   The stat us m essag e is \(http404Error.1) 
   ") 
   
// 
    输出 "The status message is Not Found" 
   
 
   
/* 
   *
*  可选(optionals)
 
   */ 
   

// 
   1.字符串-int 
   
let possibleNumber =  
   " 
   123 
   " 
   
let convertedNumber = possibleNumber.toInt() 
   
// 
    convertedNumber 被推测为类型 "Int?", 或者类型 "optional Int"


 
   // 
   2.if 语句以及强制解析 
   
 
   
if (convertedNumber != nil) {  
   // 
   和教程有点不一样呀 
   
    println( 
   " 
   \(convertedNumber)has an integer value of \(convertedNumber!) 
   ") 
   
    }  
   else { 
   
    println( 
   " 
   \(possibleNumber) could not be converted to an integer 
   ") 
   
    } 
   

// 
   3.可选绑定

 
   // 
   if let constantName == someOptional {
 
   // 
       statements
 
   // 
   } 
   
 
   
if let actualNumber = 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 包含一个可选的 Int 值 404
 
   // 
   如果你声明一个可选常量或者变量但是没有赋值,它们会自动被设置为 nil: 
   
 
   
var surveyAnswer: String? 
   
// 
    surveyAnswer 被自动设置为 nil

 
   // 
   隐式解析可选(把想要用作可 选的类型的后面的问号(String?)改成感叹号(String! )来声明一个隐式解析可选。)
 
   // 
   如果你在隐式解析可选没有值的时候尝试取值,会触发运行时错误。和你在没有值的普通可选后面加一个惊叹号一样。 
   
 
   
let possibleString: String? =  
   " 
   An optional string. 
   " 
   
println(possibleString!)  
   // 
    需要惊叹号来获取值
  
   // 
    输出 "An optional string." 
   
let assumedString: String! =  
   " 
   An implicitly unwrapped optional string. 
   " 
   
println(assumedString)  
   // 
    不需要感叹号
 
   // 
    输出 "An implicitly unwrapped optional string." 
   
 
   

if (assumedString != nil) { 
   
 println(assumedString) 
   
} 
   
  
   // 
    输出 "An implicitly unwrapped optional string." 
   
 
   if let definiteString = assumedString { 
   
    println( definiteString) 
   
     } 
   
// 
    输出 "An implicitly unwrapped optional string." 
   
 
   
/* 
   *
*  断言(assertion)
 
   */ 
   

let age = - 
   3 
   
assert(age >=  
   0,  
   " 
   A person's age cannot be less than zero 
   ") 
   
// 
    因为 age < 0,所以断言会触发结束应用。 
   
assert( age >=  
   0) 
   // 
   最简单写法 
   
 
   
/* 
   *
*  何时使用断言
 
   */ 
   
// 
   1.- 整数的附属脚本索引被传入一个自定义附属脚本实现,但是下标索引值可能太小或者太 大。
 
   // 
   2.- 需要给函数传入一个值,但是非法的值可能导致函数不能正常执行。
 
   // 
   3.- 一个可选值现在是 nil,但是后面的代码运行需要一个非 nil 值。