变量常量,注释,分号,整数,浮点数。数值行类型转换,类型别名,波尔值,元组,可选,断言
//
// 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 值。
// 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 值。