基础
1. 常量和变量
命名
常量和变量不能包含空格、数学字符、箭头、|、-或私有使用的字符(. ;等);
不能以数字开头;
不能使用关键字,必须使用需要使用(`)处理;
let π = 3.14159
let 你好 = "你好世界"
let = "dogcow"
let `if` = "nihao"
print(`if`)
打印
var friendlyWelcome = "Hello!"
print(friendlyWelcome) //输出"Hello!"
print("The current value of friendlyWelcome is \(friendlyWelcome)") // 输出 "The current value of friendlyWelcome is Hello!"
2.整数
Swift提供了8,16,32和64位形式的有符号和无符号整数。这些整数遵循类似于C的命名约定,其中8位无符号整数是类型UInt8,并且32位有符号整数是类型Int32。像Swift中的所有类型一样,这些整数类型具有大写的名称。
let signedIntegers8:Int8 = 8; //有符号int8类型
let signedIntegers64:Int64 = -64; //有符号int64类型
let unsignedIntegers8:UInt8 = 8; //无符号int8类型
let unsignedIntegers64:UInt64 = 64; //无符号int64类型
- 整数边界
可以使用其min和max属性访问每个整数类型的最小值和最大值:
let minValue = UInt8.min // minValue is equal to 0, and is of type UInt8
let maxValue = UInt8.max // maxValue is equal to 255, and is of type UInt8
- 整数范围
Int8 //[-128,127]
UInt8 //[0,255]
Int16 //[-32767,32767]
UInt16 //[0,65535]
Int32 //[-2147483647,2147483647]
UInt32 //[0,4294967295]
Int64 //[-9223372036854775808,9223372036854775808]
UInt64 //[0,18446744073709551615]
- Int
Swift还提供了一个无符号整数类型,UInt其大小与当前平台的本地词大小相同:
在32位平台上,UInt与大小相同UInt32。
在64位平台上,UInt与大小相同UInt64。
3. 浮点数
浮点类型可以表示比整数类型更宽的值范围,并且可以存储比可存储在中的大得多或小的数字Int。Swift提供了两种带符号的浮点数类型:
Double 表示64位浮点数。
Float 表示32位浮点数。
//Double具有至少15个十进制数字的精度,而精度Float可以小至6个十进制数字。在两种类型都适当的情况下,Double首选。
4. 类型安全和类型推理
let meaningOfLife = 42
// meaningOfLife is inferred to be of type Int,被推断为int类型
let pi = 3.14159
// pi is inferred to be of type Double,被推断为Double类型
let anotherPi = 3 + 0.14159
// anotherPi is also inferred to be of type Double,被推断为Double类型
5. 数值字面量
整数表示(各种进制数)
- 一个十进制数,无前缀
- 一个二进制数,带0b前缀
- 一个带前缀 的八进制数0o
- 一个十六进制数字,用0x前缀
用各进制表示17:
let decimalInteger = 17
let binaryInteger = 0b10001 // 17 in binary notation
let octalInteger = 0o21 // 17 in octal notation
let hexadecimalInteger = 0x11 // 17 in hexadecimal notation
指数表示
- 对于指数为的十进制数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
6. 数字类型之间的转换
整数之间的转换
当编译代码时,不适合大小整数类型的常量或变量的数字将报告为错误:
let cannotBeNegative: UInt8 = -1
// UInt8 cannot store negative numbers, and so this will report an error
let tooBig: Int8 = Int8.max + 1
// Int8 cannot store a number larger than its maximum value,
// and so this will also report an error
整数与浮点数之间的转换
- 整数和浮点数字类型之间的转换必须显式:
let three: UInt8 = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine //+两边需要是同一类型
//pi equals 3.14159, and is inferred to be of type Double
//-----------
let pi = three + UInt(pointOneFourOneFiveNine) //+两边需要是同一类型
// pi equals 3, and is inferred to be of type UInt8
7. 类型别名
类型别名定义现有类型的备用名称。可以使用typealias
关键字定义类型别名。
typealias AudioSample = UInt16
定义类型别名后,可以在可能使用原始名称的任何位置使用别名:
var maxAmplitudeFound = AudioSample.min
// maxAmplitudeFound is now 0
8. 布尔
Swift有一个基本的布尔类型,称为Bool。布尔值被称为逻辑,因为它们只能是真或假。Swift提供了两个布尔常量值,true并且false:
let orangesAreOrange = true
let turnipsAreDelicious = false
//orangesAreOrange和turnipsAreDelicious被推断为Bool类型
使用if
条件语句必须使用Bool类型做判断:
let i = 1
if i {
//i不是Bool值,编译时报错
// this example will not compile, and will report an error
}
修改如下:
let i = 1
if i == 1 {
// i==1 可生成一个Bool值
// this example will compile successfully
}
9. 元祖
元组将多个值分组为单个复合值。元组中的值可以是任何类型,并且不必具有彼此相同的类型。
- 创建元祖
- 创建元组时不命名各个元素
let http404Error = (404, "Not Found")
// http404Error is of type (Int, String), and equals (404, "Not Found")
//http404Error被推断为(Int,String)类型的元祖
- 创建元组时命名各个元素
let http200Status = (statusCode: 200, description: "OK")
- 分解元祖
- 全部分解
let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)")
// Prints "The status code is 404"
print("The status message is \(statusMessage)")
// Prints "The status message is Not Found"
//statusCode被推断为Int类型;statusMessage被推断为String类型;
- 部分分解
- 使用下划线忽略元祖部分元素
let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)")
// Prints "The status code is 404"
- 使用下标直接读取元祖元素
print("The status code is \(http404Error.0)")
// Prints "The status code is 404"
print("The status message is \(http404Error.1)")
// Prints "The status message is Not Found"
- 如创建元祖各个元素已命名,则可以使用元素名称访问这些元素的值:
print("The status code is \(http200Status.statusCode)")
// Prints "The status code is 200"
print("The status message is \(http200Status.description)")
// Prints "The status message is OK"
10. 可选(Optionals)/(?)
使用Optionals来表示一个值可能为空的类型;
下面的示例使用初始化程序尝试将a String转换为Int,Swift的Int类型有一个初始化器,试图将String值转换为Int值。但是,不是每个字符串都可以转换为整数。字符串"123"可以转换为数字值123,但字符串"hello, world"没有明显的数值要转换。
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
print(convertedNumber as Any)
// convertedNumber is inferred to be of type "Int?", or "optional Int"
// 此时convertedNumber的类型并不是Int,而是Int?(optional Int);因为possibleNumber转化Int并不一定会成功;
//因为初始化程序可能失败,它返回一个可选的 Int(Int?),而不是一个Int。
//问号表示它包含的值是可选的,这意味着它只能包含 Int值,或者它不包含任何值。它不能包含任何其它值,例如Bool值或String值。
11 .nil
可设置可变变量为nil:
var serverResponseCode: Int? = 404
// serverResponseCode contains an actual Int value of 404
serverResponseCode = nil
// serverResponseCode now contains no value
如果定义可选变量而不赋值,则变量将默认设置为nil:
var surveyAnswer: String?
// surveyAnswer is automatically set to nil
//surveyAnswer被推断为nil
___注意:___Swift 与Objective-C 中nil的含义不同。在Objective-C中,nil是一个指向不存在的对象的指针。在Swift中,nil不是一个指针。它是一个类型的值的缺失。任何可选类型都可以设置为nil,不只是对象类型。
12. if和强制展开 !
使用if语句判断可选对象中是否有值。可以使用(==)或(!=)来执行比较。
let convertedNumber = Int8("123") //convertedNumber为Int?(可选Int)类型
if convertedNumber != nil { //convertedNumber的值不等于nil
print("convertedNumber contains some integer value.")
}
// Prints "convertedNumber contains some integer value."
print(convertedNumber!) //确定convertedNumber一定不为nil,当convertedNumber为nil时,编译报错
if convertedNumber != nil {
print("convertedNumber has an integer value of \(convertedNumber!).") //if判断后,convertedNumber一定有值
}
// Prints "convertedNumber has an integer value of 123."
注意: 使用!访问不存在的可选值在运行时会报错误。在使用!强制解开可选值的值之前,要确保可选值的值不为nil。
13. 可选绑定
使用一下语句,将可选值someOptional提取出来给constantName,用于检查someOptional是否有值,constantName只能在if else 中使用。
if let constantName
= someOptional
{
statements
}else{
nil
}
示例:
let possibleNumber = "123"
if let actualNumber = Int(possibleNumber) { //判断Int(possibleNumber)是不是Int类型
print("\"\(possibleNumber)\" has an integer value of \(actualNumber)")
} else {
print("\"\(possibleNumber)\" could not be converted to an integer")
}
// Prints ""123" has an integer value of 123"
if Int(possibleNumber)==123 { //判断Int(possibleNumber)是否等于123
print("\"\(possibleNumber)\" is equal to 123 ")
} else {
print("\"\(possibleNumber)\" not equal to 123")
}
// Prints ""123" is equal to 123"
if语句多个条件使用逗号分开,以下两种格式含义相同,代码如下:
if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
}
// Prints "4 < 42 < 100"
if let firstNumber = Int("4") {
if let secondNumber = Int("42") {
if firstNumber < secondNumber && secondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
}
}
}
// Prints "4 < 42 < 100"
14. 异常捕捉
Swift的异常处理是在程序中响应错误和处理错误恢复程序正常运行的过程。Swift提供了一流的抛出、捕获、传播和操作可恢复的过程。
有的操作不是每次都能执行成功的,而可选链是用来判断有没有值,但操作失败时,无法知道失败的原因。错误处理就是帮助你了解失败的原因,方便你做出相应的反应。
例如,从磁盘上读取和处理文件数据的任务时,会由文件不存在于指定的路径,或文件没有读取权限,或文件没有以兼容格式编码等原因造成此任务失败。通过异常捕获机制,可以有效的解析是什么原因造成任务失败,并作出对应的操作。
详细说明请看我的Swift学习笔记:异常捕捉(Error Handling)文章。
15. 断言(Assertions)
使用在Debug模式,用于判断特定的条件,当不满足特定条件时,停止代码继续执行,并可以提供代码停止运行的原因。使用assert(Bool, message: )
写一个断言,如果Bool值为true
,代码继续执行;如果Bool值为false
,代码停止执行。示例代码:
let age = -3
assert(age >= 0, "A person's age cannot be less than zero")
//age >= 0的结果是false,执行断言
// this causes the assertion to trigger, because age is not >= 0
注: 断言在Debug模式下有效,在Release模式无效!
参考链接1
参考链接2
用来记录平时遇到的问题,不对之处还望指教。