extension的作用

Posted iOS学习-文

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了extension的作用相关的知识,希望对你有一定的参考价值。

一、在类中写

1. 比如在MainViewController类中,写一个extension 方法,这个方法里面尽量不要写成如下格式,因为会报错,找不到在clas

中创建的private lazy var 对象

// 相当于分类
extension MainTabBarController{
    private func setAddButton(){
        
        tabBar.addSubview(addBtn)
        
        // 3.设置位置
        addBtn.center =  CGPoint(x: tabBar.center.x, y: tabBar.bounds.size.height * 0.5)
    }

}

报错信息是:

Use of unresolved identifier ‘addBtn‘,

使用extension 的目的就是解耦合,但是当程序员这样写的时候,就会增加耦合,所以不建议这样写。

 

二、在类中可以使用extension来进行数据源的扩展

比如tableview,就可以使用这个进行扩展。代码如下:

// MARK:- tableView的数据源和代理方法
// extension类似OC的category,也是只能扩充方法,不能扩充属性
extension ViewController : UITableViewDataSource, UITableViewDelegate{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 20
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // 1.创建cell
        let CellID = "CellID"
        var cell = tableView.dequeueReusableCell(withIdentifier: CellID)
        
        if cell == nil {
            // 在swift中使用枚举: 1> 枚举类型.具体的类型 2> .具体的类型
            cell = UITableViewCell(style: .default, reuseIdentifier: CellID)
        }
        
        // 2.给cell设置数据
        cell?.textLabel?.text = "测试数据:\((indexPath as NSIndexPath).row)"
        
        // 3.返回cell
        return cell!
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("点击了:\((indexPath as NSIndexPath).row)")
    }
}

 

三、 遍历构造函数

比如:UIButton.

可以创建一个类,把这个类的导入改成 : import UIKit

代码如下:

import UIKit

extension UIButton {
   
    // convenience : 便利,使用convenience修饰的构造函数叫做便利构造函数
    // 遍历构造函数通常用在对系统的类进行构造函数的扩充时使用
    /* 
     遍历构造函数的特点
        1.遍历构造函数通常都是写在extension里面
        2.遍历构造函数init前面需要加载convenience
        3.在遍历构造函数中需要明确的调用self.init()
     */
    convenience init (imageName : String, bgImageName : String) {
        self.init()
        
        setImage(UIImage(named: imageName), forState: .Normal)
        setImage(UIImage(named: imageName + "_highlighted"), forState: .Highlighted)
        setBackgroundImage(UIImage(named: bgImageName), forState: .Normal)
        setBackgroundImage(UIImage(named: bgImageName + "_highlighted"), forState: .Highlighted)
        sizeToFit()
    }
}

 

四、其他:

import UIKit

extension UIButton {
    // swift中类方法是以class开头的方法.类似于OC中+开头的方法
    
    class func createButton(imageName : String, bgImageName : String) -> UIButton {
        // 1.创建btn
        let btn = UIButton()
        
        // 2.设置btn的属性
        btn.setImage(UIImage(named: imageName), forState: .Normal)
        btn.setImage(UIImage(named: imageName + "_highlighted"), forState: .Highlighted)
        btn.setBackgroundImage(UIImage(named: bgImageName), forState: .Normal)
        btn.setBackgroundImage(UIImage(named: bgImageName + "_highlighted"), forState: .Highlighted)
        btn.sizeToFit()
        
        return btn
    }
}

 

以上是关于extension的作用的主要内容,如果未能解决你的问题,请参考以下文章

刷新片段不再起作用?

这些 C++ 代码片段有啥作用?

java代码在片段活动中不起作用

如何通过单击片段内的线性布局从片段类开始新活动?下面是我的代码,但这不起作用

替换或删除后台堆栈上现有片段的代码不起作用

从父片段到选项卡片段的接口侦听器不起作用