一、构造方法
在Swift中,主要有三种构造方法:系统构造方法、普通构造方法与便利构造方法。构造方法一般都是以 init 开头的方法。
系统构造方法一般是在子类中重写系统的构造方法。
普通构造方法就是一般在子类中实现的方法,在系统构造方法中添加一些自定义的参数。
其中以上两种构造方法,合称设计构造方法。
便利构造方法一般是在扩展中实现的构造方法。
系统构造方法
仅仅是对当前对象做一些初始化操作。
// 重写视图的构造方法
override init(frame: CGRect) {
super.init(frame: frame)
// 添加一个按钮
addSubview(btn)
// 默认背景色
backgroundColor = UIColor.red
}
普通构造方法
在对当前对象做一些初始化的同时,需要带入一些必要的参数。
// 自定义的一个普通构造方法
init(title:String, color:UIColor = UIColor.yellow) {
// 系统的/自定义的构造方法
self.init()
// 设置title
setTitle(title as String, for: .normal)
setTitleColor(UIColor.black, for: .normal)
// 背景色
backgroundColor = color
}
这里的特别之处是第二个参数, 这叫可选类型的参数,可以不传。默认值是等号(=)右边的值。
便利构造方法
一般用于在扩展中定义构造方法。
extension UIButton {
// 便利构造方法 必须添加关键字'convenience' 可选参数'color'
convenience init(title:String, color:UIColor = UIColor.yellow) {
// 设计构造方法
self.init()
// 其它操作
setTitle(title, for: .normal)
setTitleColor(UIColor.black, for: .normal)
backgroundColor = color
}
convenience init(frame: CGRect, title:NSString) {
self.init(frame: frame)
setTitle(title as String, for: .normal)
}
}
对,你没有看错。与普通构造方法的区别在于在函数前面多了一个关键字 ** convenience**。
二、如何弱引用强指针
一般是在闭包中:
{ [weak self] in
// TODO
}()
weak 只能修饰可选类型. 可选链的方式调用方法,可选链返回一定是一个可选类型.
三、delegate的简单使用
代理(delegate)本身就是一个协议.
delegate的定义
import UIKit
// 加上class的意思是这个协议只能被class遵守, 以后不能将delegate属性定义成为可选类型.
protocol HGViewDelegate: class {
// 外部参数 selecedIndex 内部参数 index
func hgView(hgView: HGView, selecedIndex index: Int) ;
}
class HGView: UIView {
// 定义一个代理属性
weak var delegate: HGViewDelegate?
private func delegateTest() {
// delegate 的调用
delegate?.hgView(hgView: self, selecedIndex: 0)
}
}
delegate 的使用
import UIKit
class HGController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
// 创建一个视图
let hgView = HGView()
// hgView遵守协议
hgView.delegate = self
// 添加该视图到控制器视图
view.addSubview(hgView)
}
}
// MARK: 协议 HGViewDelegate 的实现
extension HGController: HGViewDelegate {
func hgView(hgView: HGView, selecedIndex index: Int) {
print("你点击了第 \(index) 个")
}
}
三、guard 与 if 的理解
guard 语法很强大,if能做的guard都能做,反过来,否之。话是这么一说, 其实还是guard的语法规定,决定了与if的不同。
每行代码胜过千言万语。
extension HGController {
// if 的用法
fileprivate func ifTest() {
if !status! {
// TODO: 当 status 的值为非真时, 将执行这个分支
// 在这里直接返回了, 但是在 if 语句中这个 return 不是强制的
return // 在这里使用了 return 之后, 功能完全与 guard 一致
}
// TODO: 当 status 的值为真时, 将执行这个分支
}
// guard 的用法
fileprivate func guardTest() {
guard status! else {
// TODO: 当 status 的值为非真时, 将执行这个分支
// 在 guard 语句中 这个 return 是必须要有的, 否则出错
return
}
// TODO: 当 status 的值为真时, 将执行这个分支
}
}
所有想说的, 都在注释中!
心往一处想,劲往一处使。