1、基础的数据类型
集合类型:Array
、Set
和 Dictionary
数据类型:Int
(整型值)、Double
(浮点型值)、Float
(浮点型值)、Bool
(布尔型值) 和 String
(文本型数据)
Bool
:值有两个常量true
和false
2、高阶数据类型
数据类型:Tuple
(元祖)、Optional
(可选类型)
Tuple
:创建或者传递一组数据。(比如作为函数的返回值时,你可以用一个元组可以返回多个值)
Optional
:用于处理值缺失的情况,可以用在任何类型上,不仅仅是类。(有值、或者没有值相当于nil
,比nil
更加安全、更具变现力)
3、声明常量和变量
let
:声明常量(没有发生改变的值)。
var
:声明变量()。
申请的变量和常量名,可以是任意字符、包括Unicode字符。
常量与变量名不能包含数学符号,箭头,保留的(或者非法的)Unicode 码位,连线与制表符。也不能以数字开头,但是可以在常量与变量名的其他地方包含数字。
注意:可以在一行中声明多个常量或者多个变量,用逗号隔开
var x = 0.0, y = 0.0, z = 0.0
4、类型注解
例如:名字类型为 文本类型
var name: String
也可以多个一起
var apple, pear、 banana: String
5、输出
输出函数
print(_:separator:terminator:)
下面那个是`separator`和`terminator `默认值
print(_ items: Any..., separator: String = " ", terminator: String = "\n")
var name = "zhang san"
name = "li si"
print(name)
print(我的名字\(name))
6、注释
1、// 单行注释
2、/* */ 多行注释(唯一值得注意的是,这个可以嵌套使用)
7、数值型字面量
- 一个十进制数,没有前缀
- 一个二进制数,前缀是 0b
- 一个八进制数,前缀是 0o
- 一个十六进制数,前缀是 0x
可以通过min
和max
来获取类型的最小值和最大值。
实例:
let minValue = UInt8.min(无符号)
let maxValue = UInt8.max(无符号)
let minValue2 = Int8.min(有符号)
let maxValue2 = Int8.max(有符号)
十进制数的指数为 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
7、类型别名
类型别名typealiases
,简单的说就是给已知的类起一个小名。
typealias Int2 = UInt16
var maxValue = Int2.min
8、布尔值
Bool
:在Swift里面是逻辑上的值,包括有2个布尔常量 true
个false
。通常Bool
使用在if
语句中。if
和Objective-C
有点不一样,条件值只能是Bool
值,不能是其他的常量;
在Objective-C
if (1) {
}
在Swift中,犹豫Swift的安全性,1 已经不是Bool值,不能当初 true 来使用,所以会报错
报错
if 1 {
}
不会报错
if let b = ture {
}
9、元祖
tuples
(元祖):可以装任何不同类型的容器。把多个值 组合成为一个复合的值。
let person = ("张三", 28, "男")
类型(String, Int, String)
可以将一个元祖的内容分解(decompose),成单独的常量和变量,然后你就可以正常使用它们了:
let (name, age, sex) = person
print("姓名= \(name)")
// 姓名=张三
如果你只需要一部分元组值,分解的时候可以把要忽略的部分用下划线(_)标记:
let (name, _) = person
print("name = \(name)")
// 输出“姓名=张三”
此外,你还可以通过下标来访问元组中的单个元素,下标从零开始:
print("name = \(person.0)")
// 输出“姓名=张三”
定义元组的时候给单个元素命名:
let person = (name:"张三", age:28, sex="男")
print("name = \(person.name)")
// 输出“姓名=张三”
10、可选类型
可选类型用?
表示。
var age: Int? = 18
var name: String? = nil
nil 只能使用在可选类型
注意:nil 不能用于非可选的常量和变量。如果你的代码中有常量或者变量需要处理值缺失的情况,请把它们声明成对应的可选类型。
可以使用构造器的形式
来相互转换,和OC
中的强制转换差不多。
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// convertedNumber 被推测为类型 "Int?", 或者类型 "optional Int"
因为该构造器可能会失败,所以它返回一个可选类型(
optional
)Int
,而不是一个Int
。一个可选的Int
被写作Int?
而不是Int
。问号暗示包含的值是可选类型,也就是说可能包含Int
值也可能不包含值。(不能包含其他任何值比如Bool
值或者String
值。只能是Int
或者什么都没有。)
如果你声明一个可选常量或者变量但是没有赋值,它们会自动被设置为 nil:
var name: String?
// name 被自动设置为 nil
注意:
1、nil 在Swift 和 Objective-C 中不一样。
2、在 Objective-C 中,nil 是一个指向不存在对象的指针
。
3、在 Swift 中,nil 是一个确定的值
,用来表示值缺失
。
4、任何类型的可选状态都可以被设置为 nil,不只是对象类型。
11、if 语句以及强制解析
确定 可选类型有值 之后,你可以在可选的名字后面加一个感叹号(!)来获取值。
if name != nil {
print("姓名=\(name!).")
}
// 输出“姓名=张三.”
注意:
使用 ! 来获取一个不存在的可选值会导致运行时错误。
使用 ! 来强制解析值之前,一定要确定可选包含一个非 nil 的值。
12、可选绑定(optional binding)
这条语句不仅可以用来判断可选类型中是否有值,同时可以将可选类型中的值赋给一个常量或者变量。主要用在if
和while
语句中。
if let constantName = someOptional {
statements
}
// 可选绑定来重写
if let actualNumber = Int(possibleNumber) {
print("\'\(possibleNumber)\' has an integer value of \(actualNumber)")
} else {
print("\'\(possibleNumber)\' could not be converted to an integer")
}
// 输出“'123' has an integer value of 123”
如果转换成功,actualNumber 常量可以在 if 语句的第一个分支中使用。它已经被可选类型 包含的 值初始化过,所以不需要再使用 ! 后缀来获取它的值。在这个例子中,actualNumber 只被用来输出转换结果。
13、隐式解析可选类型(implicitly unwrapped optionals)
把想要用作可选的类型的后面的问号(String?
)改成感叹号(String!
)来声明一个隐式解析可选类型
。
let possibleString: String? = "可选类型"
let forcedString: String = possibleString! // 需要感叹号来获取值
let assumedString: String! = "隐式解析可选类型字符串"
let implicitString: String = assumedString // 不需要感叹号
14、错误处理
一个错误处理如何用来应对不同错误条件的例子:
// 制作三明治
func makeASandwich() throws {
// ...
}
do {
try makeASandwich()
eatASandwich()
} catch SandwichError.outOfCleanDishes {
washDishes()
} catch SandwichError.missingIngredients(let ingredients) {
buyGroceries(ingredients)
}
15、断言和先决条件
断言和先决条件是在运行时所做的检查。
一、断言:
Swift 标准库的 assert(::file:line:) 函数来写一个断言。
let age = -3
assert(age >= 0, "A person's age cannot be less than zero")
// 因为 age < 0,所以断言会触发
使用 assertionFailure(_:file:line:) 函数来表明断言失败了。
if age > 10 {
print("You can ride the roller-coaster or the ferris wheel.")
} else if age > 0 {
print("You can ride the ferris wheel.")
} else {
assertionFailure("A person's age can't be less than zero.")
}
二、强制执行先决条件:
使用全局 precondition(::file:line:) 函数来写一个先决条件。
// 在一个下标的实现里...
precondition(index > 0, "Index must be greater than zero.")
网友评论