学了两天swift4发现它已经不是从前的那个swift的了,其中很多调用和写法都发生很大的变化,比如GCD的调用,闭包的一些使用,接下来的一段时间我会把,所碰到的问题和修改先列在这,由于时间比较紧,所以后面有时间了在做排版整理。看官先将就一些。
语言变化和一些坑的总结
第一点
//Function types cannot have argument labels; use '_' before 'index' insert '_'
报错重现:
func scrollView(frame: CGRect, numberOfLabel: () -> Int, labelOfIndex: (index: Int)->UILabel) -> UIScrollView
解决方案
// 此处要注意的是labelOfIndex这个闭包,参数部分按之前的写法是在此处声明形参和类型,按最新的写法是在用的时候再去声明,此处之申明类型
func scrollView(frame: CGRect, numberOfLabel: () -> Int, labelOfIndex: (Int)->UILabel) -> UIScrollView {
// code
}
let labelOfIndex = { (index: Int) -> UILabel in
let label = UILabel()
label.text = "标签 \(index)"
label.sizeToFit()
return label
}
// self.可以不用写
view.addSubview(scrollView(frame: rect, numberOfLabel: numberOfLabel, labelOfIndex: labelOfIndex))
对闭包做一点补充说明:
oc的block和swift的闭包的区别
为什么在oc中叫block,在swift就要改成叫闭包呢?
是因为swift里的闭包结构发生变化了,在oc中block是一个匿名函数指针,在swift里函数是特殊的闭包。闭包的范围更大。
第二点
GCD swift4的写法:
func loadData() {
DispatchQueue.global().async { () -> Void in
print("玩命加载中 \(Thread.current)")
DispatchQueue.main.async {
print("回调 \(Thread.current)")
}
}
}
第三点 在swift中?和!的使用
?代表可有可无:
e.g:var a: Int? 代表a要么是int类型 要么为nil;
!强行解包,代表肯定是有值的,在代码执行的如果为nil程序会蹦到!的地方。便于我们查找问题。
吐槽:
在当初刚开始学习oc的时候,代码只要以报错就蹦到main函数,内心很绝望啊,到是告诉我哪错了呀,后面随着不断的学习也了解到是因为oc是运行时的一个机制,它是动态转发消息,在转发消息的时候崩掉了,就蹦到main函数了,然后给一堆错误提示让我们自己去找。
第四点 swift中重载和重写
在swift的时候了解到,在swift的中是支持重载的,这也是很多面向对象的语言所具备的功能。
要注意的是重载和重写是不一样的哦,新接触的开发的同学要注意了,
重载是函数名一样,参数的类型和数量不同。重写是重写父类的方法,覆盖父类的方法,比如见得最多的override init()重写构造函数。
第五点 swift和oc中构造函数的区别
1. swift的中构造函数支持重载,oc是不支持的
2. 构造函数在执行的顺序不同,swift是先给本类分配空间,初始化值,然后在调父类的构造函数。oc是相反的
第六点 Extra argument 'method' in call
或者 Extra argument 'XXXX' in call 类似的错误,是你代码写错了,但是不一定是它报错的位置,如果实在找不到哪里写错了,可以把报错的方法重新写一遍就好