一:常量
- 1.只能赋值一次
- 2.值不要求在编译期间就确定,也就是说可以是编译期,也可以是运行期再确定. 但是在使用前必须赋值
- 3.常量变量在初始化之前都不能使用
二:常见的数据类型
Swift
中的数据类型分为两种值类型
和引用类型
:
可以看到,没有了
OC
中的基本数据类型了,OC
中的基本数据类型都变成了结构体
类型.
思考一下?:为什么Int这种简单的数据类型也要用结构体?
-
整数类型又分为:
Int 8 :
8位,一个字节
Int 16 :
16位,2个字节
Int 32 :
32位,4个字节
Int 64:
64位,8个字节
UInt 8 ,UInt 16 ,UInt 32 ,UInt 64 :
无符号整数类型 (u : unsigned
) -
浮点类型:
Float :
32位,精度只有6有位
Double :
64位,精度至少15位
3.浮点类型有多种表达方式:
-
十进制表示:
314.0
=3.14e2
: 3.14e2 表示:3.14 乘以 10 的 2 次方
0.0314
=3.14e-2
:3.14e-2 表示:3.14 乘以 10 的 -2 次方 -
十六进制表示:
40.0 = 0xAp2
:0xAp2 表示: 0xA 乘以 2 的 2 次方
2.5 = 0xAp-2
:0xAp-2 表示: 0xA 乘以 2 的 -2 次方
三:元组 (Tuple)
元组就是将多个类型组合成一个对象:
- 元组的定义和访问
//定义元组
let resultTuple = (14,"Tom")
//通过下标访问元素
print("age is \(resultTuple.0) name is \(resultTuple.1)")
//定义有标签的元组
let resultTuple2 = (age: 22 , name: "Jack")
//通过标签访问元素
print("age is \(resultTuple2.age) name is \(resultTuple2.name)")
- 元组分解:
let (age , name) = resultTuple2
print("age is \(age) name is \(name)")
- 使用场景:
3.1 作为函数的返回值(多个返回值
)和参数
func funcTest(v1: Int, v2: String) -> (result1: Int, result2: String){
//定义元组
let resultTuple = (14,"Tom")
//通过下标访问元组
print("age is \(resultTuple.0) name is \(resultTuple.1)")
//定义有标签的元组
let resultTuple2 = (age: 22 , name: "Jack")
print("age is \(resultTuple2.age) name is \(resultTuple2.name)")
let (age , name) = resultTuple2
print("age is \(age) name is \(name)")
return resultTuple
}
funcTest(v1: 22, v2: "Jcak")
3.2 值绑定
//元组值绑定
func tupleTest(){
let point = (8,8)
switch point {
case (let x,0):
print("点在 y 轴上 x坐标为\(x)")
case (0, let y):
print("点在 x 轴上 坐标为\(y)")
case (0...8,0...8):
print("坐标在 0 ~ 8 范围内")
case(let x, let y):
print("x坐标为\(x) , y坐标为\(y)")
}
}
三:流程控制
-
if
,while
后面的条件语句可以省略小括号.
-
-
swift 3
以后省略了++
,--
运算符,使用-=, +=
代替
-
-
for
循环使用区间运算符- 1.
1...3
:闭区间,取值1,2,3 - 2.
1..<3
:半开区间,取值1,2 - 3.
...3
:单侧区间,让区间朝一个方向尽可能远,只要不越界
- 1.
-
-
4.带间隔的区间值
func test(){
let finish = 12
let interval = 3
// 从6开始,到12为止,间隔 3 打印,包括 12
for i in stride(from: 6, through: finish, by: interval){
print(i)
}
print("---------------------")
// 从6开始,到12为止,间隔 3 打印,不包括 12
for i in stride(from: 6, to: finish, by: interval){
print(i)
}
}
- 5.
switch
- 1switch
必须要保证能处理所有情况
- 2switch
中的case
和default
后面不能写大括号
- 3.switch
可以默认不写break
,不会贯穿到最后面
如果想要实现贯穿效果,可以使用fallthrough
- 4.case
,default
后面至少要有一条语句
- 5.switch
也支持Character
,String
类型
- 6.switch
同样支持区间匹配0...3
,元组匹配(-2...2,-2...2)
四:函数
4.1 函数的定义
func sum(v1: Int, v2: Int) -> Int{
v1 + v2
}
print(sum(v1: 10, v2: 20))
无返回值的三种写法:
func returnVoid1(v1: String) -> (){
//无返回值 可直接空元组
}
func returnVoid2(v1: String) -> Void{
//无返回值 Void
}
func returnVoid3(v1: String){
//无返回值 什么也不写
}
4.2 参数标签
func sum3(v1: Int , v2: Int) -> Int{
v1 + v2
}
//参数标签 v1 , v2
sum3(v1: 10, v2: 20)
可使用_
省略参数标签
//参数标签
func sum3(_ v1: Int , _ v2: Int) -> Int{
v1 + v2
}
//省略参数标签 v1 , v2
sum3(10, 20)
4.3 可变参数
//可变参数
func sum1(numbs:Int...) -> Int{
var sum = 0
for number in numbs{
sum += number
}
return sum
}
print(sum1(numbs: 10,20,30))
需要注意的是:一个函数最多只能有1个可变参数,且紧跟在可变参数后面的参数不能省略参数标签,因为一旦省略可变参数后面参数的参数标签,编译器就无法判断给哪个形参赋值
4.4 swift
自带 print
函数
public func print(_ items: Any..., separator: String = " ", terminator: String = "\n")
其实print
函数的第一个参数就是一个可变参数.后面两个参数都已经设置了默认值,分别是间隔符和换行符号.我们可以自己更改后面两个参数:
4.5 输入输出参数 (In-Out Parameter)
swift
中函数的参数默认是let
(常量),并且规定只能是常量:
所以,如果我们想要在函数内部修改外部实参的值,就需要用inout
定义一个输入输出参数:
//输入输出参数
var num = 10
func inOutTest(_ v1: inout Int){
v1 = 20
}
inOutTest(&num)
注意:
1:
inout
参数不能有默认值
2:
inout
参数只能传入可以被多次赋值的
3:
可变参数不能标记为inout
4:
inout
参数本质是 地址传递 (引用传递).这一点我们可以通过汇编证明:
我们在inOutTest(&num)
处打一断点,进入汇编代码如下:
五:函数类型 (Function Type)
函数类型由 参数类型 + 返回值类型
组成:
func sum(v1: Int, v2: Int) -> Int{
v1 + v2
}
//定义一个类型为 (Int,Int) -> Int 的函数常量 fn , 并把 sum 函数赋值给 fn
let fn:(Int,Int) -> Int = sum
//调用 fn,并且不需要写 参数标签
let num = fn(2,3)
print(num)
函数类型作为参数使用:
//函数类型作为参数使用
func funcTypeTest(_ fn: (Int,Int) -> Int, v2: Int ,v3: Int) -> Int{
//调用作为参数传入的函数 fn
fn(v2,v3)
}
let rel = funcTypeTest(sum, v2: 5, v3: 5)
print(rel)
函数类型作为返回值使用:
////函数类型作为 返回值
func funcTypeTest2(_ v1: String) -> (Int,Int) -> Int{
func plus (_ v1: Int, _ v2: Int) -> Int{
v1 + v2
}
func sub (_ v1: Int, _ v2: Int) -> Int{
v1 - v2
}
switch v1 {
case "+":
return plus
case "-":
return sub
default:
return plus
}
}
let rel2 = funcTypeTest2("+")(1,1)
print(rel2)
网友评论