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

Swift中的required修饰符

2016-06-14 16:41 423 查看
 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")

            }

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

        */
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息