美文网首页iOS-swiftiOS学习
Swift 引发的一场知识暴动

Swift 引发的一场知识暴动

作者: CoderHG | 来源:发表于2017-08-12 14:24 被阅读101次

    一、构造方法

    在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) 个")
        }
    }
    

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

    相关文章

      网友评论

      • Azzan:学习一下,你是棒棒哒

      本文标题:Swift 引发的一场知识暴动

      本文链接:https://www.haomeiwen.com/subject/iqfjrxtx.html