swift流程控制 函数 相关要点

2020-04-21  本文已影响0人  卡卡罗忒

循环

repeat{
    
}while a > 0
相当于do while


for var i in 0...3{
}
i默认是常量,如果想要修改,可以var声明为变量

区间

闭合区间

let range0 = 0 ... 3 //<=0 <=3
let range1 = 0 ..< 3 //<=0 <3
//用于数组
let arr = ["a","b","c","d","e"]
for i in arr[0...3]{
    print(i) //a.b.c.d
}

单侧区间

let arr = ["a","b","c","d","e"]
for i in arr[1...] {
    print(i)//bcde 从0开始到数组最大值
}
for i in arr[...3] {
    print(i)//abce 从0开始到下标3
}
for i in 0... {
    print(i)//从0到Int最大值
}

let range = ...5
range.contains(-10) //true
range.contains(5) //true
range.contains(7) //false

单侧区间可以用于字符串,但不能用于for循环中
let range = "cc"..."ff" // cc cd ce ...... fc fd fe ff
range.contains("aa") //false
range.contains("cd") //true
range.contains("fg") //false

switch

break可以省略不写 与oc的区别

在case 最后加一个fallthrough可以贯穿下一个

支持string

可以case 多个值用逗号隔开 case 1,2:

case可以区间匹配

var num = 1
switch num {
case 1...10:
    print("1到10都会走这个case")
default:
    print(num)
}

case可以元祖匹配

let point = (1,1)
switch point {
case (0,1):
    print("不会走这里")
case (0,-1...1):
    print("不会走这里")
case (1,-1...1):
    print("走这里")
case (0...1920,0...1080):
    print("走这里,可以判断点在不在个范围里")
default:
    print()
}

值绑定

let point = (1,1)
switch point {
case (let x,3):
    print("假如一个元祖的1的位置为3,那么x就等于这个元祖的0的位置的值")
case (let x,let y) where x == y:
    print("where相当于一个条件判断 只有x == y 才会走到这里")
case (let x,let y):
    print("无论x,y等于多少都会走这里")
}

where

where除了上面可以用在case里面还可以用在for循环里

var arr = [0,1,12,-3,4,68,-1000_0000]
var sum = 0
for num in arr where num > 0 {//只把大于零的元素累加
    sum += num
}
sum 等于 85

标签语句

可以在for前面加上一个自定义标识符,然后continue或者break时区分外圈循环还是内圈循环.有些绕

outer: for i in 0...5{
    for j in 0...5{
        if j == 3{
            continue outer
        }
        if i == 3{
            break outer
        }
        print("j == \(j),i == \(i)")
    }
}
j == 0,i == 0
j == 1,i == 0
j == 2,i == 0
j == 0,i == 1
j == 1,i == 1
j == 2,i == 1
j == 0,i == 2
j == 1,i == 2
j == 2,i == 2

函数注意

可变参数

1个函数只能含有一个可变参数

func sum(_ numbers:Int...) ->Int{
    return numbers.reduce(0, {($0 + $1)})
}
print(sum(1,2,3)) // 6

inout参数调用时需要加上& 因为 inout 是地址传递,不是值传递

var num = 10
func change(num:inout Int){
    num = 20
}
change(num: &num)
print(num)//20

内联函数 编译器优化在编译的时候如果遇到 函数体比较少的代码 会直接拿出函数体执行

func fuck(){
    print("")
}
fuck()

想要不被优化为内联函数要加上@inline(never) func ………
@inline(__always) 一直被内联(递归函数,动态派发函数不算)

这样的函数会直接取出函数体,省去函数调用(省掉了栈去的开辟释放)

上一篇下一篇

猜你喜欢

热点阅读