Swift 随堂小节

一、构造方法

在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 的值为真时, 将执行这个分支
        
    }
}

所有想说的, 都在注释中!

心往一处想,劲往一处使。

推荐阅读更多精彩内容

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 964评论 1 3
  • 构造过程 构造过程是使用类、结构体或枚举类型的实例之前的准备过程。在新实例可用前必须执行这个过程,具体操作包括设置...
    蛊毒_阅读 101评论 0 2
  • 本章将会介绍 存储属性的初始赋值自定义构造过程默认构造器值类型的构造器代理类的继承和构造过程可失败构造器必要构造器...
    寒桥阅读 196评论 0 0
  • 构造过程是使用类、结构体或枚举类型的实例之前的准备过程。在新实例可用前必须执行这个过程,具体操作包括设置实例中每个...
    莽原奔马668阅读 97评论 0 2
  • 看到李小伟的15年总结,颇有感触。想自己去年的目标和计划不多,主次清晰,可……最后一个都没实现。当然,也与突发事件...
    镜姑娘阅读 30评论 0 0