您的位置:首页 > 移动开发 > Swift

Swift之便利构造函数

2015-12-18 01:35 381 查看
1.默认情况下,所有的构造方法都是指定构造函数 Designated,那么什么是所谓的便利构造函数呢?

由convenience关键字修饰的构造方法就是便利构造函数.

2.便利构造函数的特点?

a.可以返回nil

b.只有便利构造函数中可以调用 self.init()

c.便利构造函数不能被重写或者super

如下面例子;

/// `便利构造函数`

///

/// - parameter name: 姓名

/// - parameter age:  年龄

///

/// - returns: Person 对象,如果年龄过小或者过大,返回 nil

convenience init?(name: String, age: Int) {

    if age < 20 || age > 100 {

        return nil

    }

    self.init(dict: ["name": name, "age": age])

}

注意:在 Xcode 中,输入 self.init 时没有智能提示

/// 学生类

class Student: Person {

    /// 学号

    var no: String?

    convenience init?(name: String, age: Int, no: String) {

        self.init(name: name, age: age)

        self.no = no

    }

3.使用场景:

根据给定参数判断是否创建对象,而不像指定构造函数那样必须要实例化一个对象出来

在实际开发中,可以对已有类的构造函数进行扩展,利用便利构造函数,简化对象的创建

4.在封装某个控件的属性时,可以灵活使用,因为其可以返回nil,故使用变得更加灵活.在调用时,不必要使用的属性便可以不用出现.

示例:

UILabel的属性封装:

convenience init(textColor: UIColor,fontSize: CGFloat ,maxWidth: CGFloat = 0){

    

        self.init()

        self.textColor = textColor

        self.font = UIFont.systemFontOfSize(fontSize)

        

        //判断最大宽度

        if maxWidth > 0 {

        

            numberOfLines = 0

            //可以通过设置布局的最大宽度,告诉系统我要在哪里换行

          

            preferredMaxLayoutWidth = maxWidth

        

        }

    }

外界对其的调用:

可以根据具体情况,灵活使用:

// 时间

    private lazy var timeLabel: UILabel = UILabel(textColor: UIColor.orangeColor(), fontSize: 10)

//内容

private lazy var contentLabel: UILabel = UILabel(textColor: UIColor.darkGrayColor(), fontSize: 15, maxWidth: KSCREENW - 2 * GHStatusCellMargin)

小结:

1.如上述两个例子,一个没有完全使用封装的属性,将maxWidth给舍弃了,但并不影响,显示了其灵活性

2.便利构造函数必须调用同一类中定义的其他指定构造函数或者用 self. 的方式调用父类的便利构造函数

3.便利构造函数可以返回 nil

4.便利构造函数不能被重写

5.指定构造函数必须调用其直接父类的的指定构造函数(除非没有父类)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  函数 swift