首页 > 其他分享 >Swift基础之init方法,实例(对象)方法,类(静态)方法的使用(多标签Demo)

Swift基础之init方法,实例(对象)方法,类(静态)方法的使用(多标签Demo)

时间:2022-11-28 17:04:10浏览次数:40  
标签:Demo width init 实例 labelL strSize 方法


Xcode更新过后,有些方法都进行了改变,Demo中有变化的都进行了简单的标记,具体以后遇见再说

创建一个UIView类,用init方法创建两种类型,显示多标签,创建静态方法进行调用,创建类方法进行调用

首先代码:用init方法创建两种类型,显示多标签

//初始化数组中是NSString类型的标签视图
    init(frame: CGRect,textArray aArray:NSArray,textFont aFont:UIFont){
        super.init(frame: frame);
        
        //首先获取宽、高,确定显示的位置
        let widthF:CGFloat = frame.size.width;
        //然后创建标签视图,注意:这个方法传过来的数组中就是NSString类型,可以直接显示
        var labelWidthF:CGFloat = 0.0;
        var labelHeightF:CGFloat = 0.0;
        for i in 0...aArray.count-1 {
            //获取内容大小
            let str = aArray[i] as! String;
            let strSize:CGSize = self.sizeWithFont(content: str as NSString , font: aFont, maxSize: CGSize.init(width: CGFloat(MAXFLOAT), height:CGFloat(MAXFLOAT)));
            //判断宽、高
            if widthF < labelWidthF+strSize.width+20 {
                labelWidthF = 0.0;
                labelHeightF = labelHeightF+strSize.height+20;
            }
            //创建Lable
            let labelL = UILabel.init(frame: CGRect.init(x: labelWidthF, y: labelHeightF, width: strSize.width+20, height: strSize.height+20));//CG系列变化了,没有了make,而是init
            labelL.text = str as String;
            labelL.textAlignment = NSTextAlignment.center;
            labelL.backgroundColor = UIColor.lightGray;//UIColor变化了,少了color
            labelL.font = aFont;
            self.addSubview(labelL);
            
            labelWidthF = labelWidthF+strSize.width+20;
        }
    }
    //初始化数组中是NSDictionary类型的标签视图
    init(frame: CGRect, textArray aArray:NSArray, keyStr aKeyStr:String, textFont aFont:UIFont){
        super.init(frame: frame);
        
        //首先获取宽、高,确定显示的位置
        let widthF:CGFloat = frame.size.width;
        //然后创建标签视图,注意:这个方法传过来的数组中是NSDictionary
        var labelWidthF:CGFloat = 0.0;
        var labelHeightF:CGFloat = 0.0;
        for i in 0...aArray.count-1 {
            //获取内容大小
            let dic:NSDictionary = aArray[i] as! NSDictionary;
            let str = dic[aKeyStr] as! String;
            let strSize:CGSize = self.sizeWithFont(content: str as NSString, font: aFont, maxSize: CGSize.init(width: CGFloat(MAXFLOAT), height:CGFloat(MAXFLOAT)));
            //判断宽、高
            if widthF < labelWidthF+strSize.width+20 {
                labelWidthF = 0.0;
                labelHeightF = labelHeightF+strSize.height+20;
            }
            //创建Lable
            let labelL = UILabel.init(frame: CGRect.init(x: labelWidthF, y: labelHeightF, width: strSize.width+20, height: strSize.height+20));//CG系列变化了,没有了make,而是init
            labelL.text = str as String;
            labelL.textAlignment = NSTextAlignment.center;
            labelL.backgroundColor = UIColor.lightGray;//UIColor变化了,少了color
            labelL.font = aFont;
            self.addSubview(labelL);
            
            labelWidthF = labelWidthF+strSize.width+20;
        }
    }

创建实例方法获取字符串大小

//创建实例方法
    func sizeWithFont(content:NSString,font aFont:UIFont,maxSize aMaxSize:CGSize) -> CGSize {
        let attrs:NSDictionary = [NSFontAttributeName : aFont];
        return content.boundingRect(with: aMaxSize, options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: attrs as? [String : Any], context: nil).size;
    }

创建一个类方法(静态方法)

    //创建类方法(静态方法)
    class func oneLabel(myLabel:UILabel) {
        myLabel.layer.cornerRadius = 5;
        myLabel.layer.borderColor = UIColor.blue.cgColor;
        myLabel.layer.borderWidth = 1;
        myLabel.clipsToBounds = true;
        myLabel.adjustsFontSizeToFitWidth = true;
    }

利用类方法创建一个Label

//创建一个Label
        let myLabel = UILabel.init(frame: CGRect.init(x: 50, y: 320, width: 200, height: 50));
        myLabel.text = "这是一个类方法设计的Lable";
        BHMoreLabelView.oneLabel(myLabel: myLabel);
        self.view.addSubview(myLabel);

有问题请留言。。。。。。。​​源码下

Swift基础之init方法,实例(对象)方法,类(静态)方法的使用(多标签Demo)_swift

2017.07.27更新,关于实例(对象)方法、类(静态)方法的讲解

什么是类方法和实例方法?
  iOS中的类可以声明两种类型的方法:类方法和实例方法。 类方法,也称静态方法,是指属于某个类的方法,此方法属于类本身,不属于类的某一个实例(对象)。实例方法是指属于某一个实例的方法,必须首先创建类的一个实例以后才可以调用实例方法,每个实例(对象)都有自身的实例方法,互相独立,不共享。在语法上,+表示类方法,类似于​​C语言​​的static关键字,-表示是实例(对象)方法。

调用

类方法

  调用方式:类名.方法名。

实例方法

  调用方式:对象名.方法名、[对象名 方法名]。

注意: 
1、类方法可以调用类方法。
2、类方法不可以调用实例方法,但是类方法可以通过创建对象来访问实例方法。
3、类方法不可以使用实例变量(静态数据成员可以访问),但类方法可以使用self,因为self不是实例变量。

关于类方法和实例方法的一些误区:
1、类方法常驻内存,实例方法不是,所以类方法效率高但占内存。
事实上,方法都是一样的。在加载时机和占用内存上,类方法和实例方法是一样的,在第一次被使用时加载,调用的速度基本上没有差别。
2、静态方法在堆上分配内存存放,实例方法在堆栈上存放。
事实上所有的方法都不可能存在于堆或者堆栈上,方法作为代码是被加载到特殊的代码内存区域,即代码区,而且代码区是只读的。

附一道面试题:调用一个类的静态方法需不需要release?(内存管理)

  静态成员方法不需要对象,不需要release。其实静态成员方法也是有对象的,叫做类对象,但这个是在第一次访问类成员时将其加载到内存的,而且该类对象只在程序关闭时才会释放,并不由程序本身控制。
  有三个概念要分清:类、实例和对象,类本身加载到内存(可能是代码段的内存,不是堆内存,也不是栈内存),可以叫做一个对象;创建一个类的实例,这个实例可以叫做一个对象,所以就有类对象和实例对象之分了,类对象就是一张图纸,实例对象是按类对象造出的一橦楼,确实都是实实在在存在的东西,所以叫对象,只不过性质不同,一个是图纸,一个是按图纸造出来的楼房。



标签:Demo,width,init,实例,labelL,strSize,方法
From: https://blog.51cto.com/u_15894905/5892258

相关文章

  • iOS开发之字数不一的多标签Demo
    有朋友让帮他写一个封装的字数不一的多标签视图,所以今天将代码展示一下,供大家学习代码中封装了两种方法,分别是:1.传递数组,数组中是NSString类型的方法;2.传递数组,数组中是NSDi......
  • Swift基础之Delegate方法的使用
    本文简单介绍了使用Delegate方法的进行值的传递,改变上一个界面的字体大小和颜色首先创建一个导航视图:letviewC=ViewController();       letnavigationC=UIN......
  • Swift基础之对FMDB第三方的使用方法
    相信大家都熟悉OC使用FMDB第三方库,进行数据库操作,增、删、改、查,现在我就来利用代码展示一下Swift对此库的使用方法,我是通过Pods添加的第三方库,如果手动添加记得创建桥接文......
  • @TestInstance的使用 / @BeforeAll必须为static方法?
    @BeforeAllJunit5会在每个测试方法执行之前创建一个新的测试类实例,如果为每个测试方法都新创建实例,如何让@BeforeAll方法在只执行一侧的情况下,每个方法都可以使用到?在@Be......
  • MYSQL-8.0.31 windows免安装 版安装 方法
    1从官方下载绿色安装包 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.31-winx64.zip2解压到C:\mysql-8.0.31-winx64\建立data目录新建m......
  • MySQL数据库:8、多表查询的方法与思路
    目录一、多表查询思路数据准备1、笛卡尔积1、1.代码实践1、2.笛卡尔积进阶操作2、连表操作2、1.内连接2、2.左连接2、3.右连接2、4.全连接3、子查询3、1.子查询代码实践一......
  • Vue 2.x源码学习:render方法、模板解析和依赖收集
    众所周知,Vue的脚手架项目是通过编写.vue文件来对应vue里组件,然后.vue文件是通过vue-loader来解析的,下面是我学习组件渲染过程和模板解析中的一些笔记。之前的笔记:应用初......
  • Ext Js中Ext.XTemplate使用方法学习
    1:基本知识    XTemplate是Ext.Template扩展的新类,它支持高级功能的模板类,如自动数组输出、条件判断、子模板、基本数学运行、特殊内建的模板变量,直接执行代码和更多的......
  • vue大文件上传demo
    ​ 以ASP.NETCoreWebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API,包括文件的上传和下载。 准备文件上传的API #region 文件上传......
  • window qt 路径中包含中文和空格解决方法
    对于window用户,文件名和文件夹经常使用中文来命名,或者文件夹包含了空格,类似“ProgramFile”这样的。针对以上场景,经常发生读写文件或者图片失败的情况。下面提供解决方案......