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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

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