Swift中的required修饰符

本文介绍了Swift中`required`修饰符的用法,重点讨论了如何在子类中处理父类的`required`初始化方法。通过示例代码,阐述了当子类需要自定义初始化方法或无需额外初始化方法时,如何正确实现和使用`required`修饰的初始化方法。

 func lainxi() {

        

        //1.首先定义一个基类,一说到required修饰符,我们最先想到的应该就是普通类(class)的init()方法了

        class MyClass {

            var str:String

            init(str:String) {

                self.str = str

            }

        }

    

        //2.定义一个MyClass 的子类 MySubClass

        class MySubClass:MyClass {

            

        }

        

        let a1 =  MySubClass(str:"Hello Swift")//继承了它父类

        print(a1.str)//Hello Swift

        

        class MySubClass2:MyClass {

            

            override init(str:String) {//init()方法前加上override修饰符,表示MySubClass重写了其父类的init()方法,然后还要调用父类的init()方法,并将参数一并传给父类的方法

                super.init(str:str)

            }   

        }

        

        let a2 =  MySubClass2(str:"Hello Swift")

        print(a2.str)////Hello Swift


        /*应用:

        ** 比如 子类化的时候需要自定义初始化方法

        */

        class MySubClass3:MyClass

        {

            //当子类的初始化方法参数类型与父类的初始化方法参数类型不同时,我们就不必在子类的初始化方法前加override修饰符了

            //但是要把子类初始化方法的参数类型转换为符合父类初始化方法的参数类型,然后传给父类的初始化方法

            init(i:Int) {

                super.init(str:String(i))

            }

        }

        let a3 =  MySubClass3(i: 10)


        

        

        //required修饰符

        //给父类的init()方法加上required修饰符

        class SomeClass {

            var str:String

            required init(str:String) {

                self.str = str

            }

        }

        

//        class SomeSubClass:SomeClass

//        {

//            init(i:Int) {

//                super.init(str:String(i))

//            }

//

//            // 编译错误  上面的代码在编译会发生错误,因为我们没有实现父类中要去必须要实现的方法

//        }

        

        

        class SomeSubClass:SomeClass {

            required init(str:String) {

                super.init(str: str)

            }

            //            required init(str: String) {

            //                fatalError("init(str:) has not been implemented")

            //            }

            init(i:Int) {

                super.init(str:String(i))

            }

            

        }

        //从上面的代码示例中不难看出,如果子类需要添加异于父类的初始化方法时,必须先要实现父类中使用required修饰符修饰过的初始化方法,并且也要使用required修饰符而不是override

        //如果子类中不需要添加任何初始化方法,我们则可以忽略父类的required初始化方法:

        

        /*

        **

        required修饰符的使用规则

        required修饰符只能用于修饰类初始化方法。

        当子类含有异于父类的初始化方法时(初始化方法参数类型和数量异于父类),子类必须要实现父类的required初始化方法,并且也要使用required修饰符而不是override

        当子类没有初始化方法时,可以不用实现父类的required初始化方法。

        */


        let a4 = SomeSubClass(i: 10)

        

    }


/*

        ** 应用:

        *  比如:在子类化视图的时候 重写初始化方法的时候需要:

            override init(frame: CGRect) {

                super.init(frame: frame)

            

           

            }

        

            required init?(coder aDecoder: NSCoder) {

                fatalError("init(coder:) has not been implemented")

            }

这也是解释重写初始化方法的时候 不写上面的方法会提示错误的原因

        */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值