Swift中的required修饰符

转载 2015年11月19日 11:27:19

普通子类

通常情况下,一说到required修饰符,我们最先想到的应该就是普通类(class)的init()方法了。比如下面这个类:

class MyClass {
    var str:String
    init(str:String) {
        self.str = str
    }
}

当我们定义一个MyClass的子类(subclass)并实例化这个子类时,我们一般会如何做呢?没错,通常情况下都会是这样:

class MyClass {
    var str:String
    init(str:String) {
        self.str = str
    }
}

class MySubClass:MyClass {
   
}

var MySubClass(str:"Hello Swift")

大伙应该已经注意到了,在实例化MySubClass时,其实是继承了它父类MyClassinit()方法。那我们再来看看子类的初始化方法。

子类的初始化方法

如果我们在子类中添加一个init()方法,像这样:

class MyClass {
    var str:String
    init(str:String) {
        self.str = str
    }
}

class MySubClass:MyClass {
    override init(str:String) {
        super.init(str:str)
    }   
}

var MySubClass(str:"Hello Swift")

那么我们首先要在init()方法前加上override修饰符,表示MySubClass重写了其父类的init()方法,然后还要调用父类的init()方法,并将参数一并传给父类的方法。

在实际运用中,也有另外一种情况,当子类的初始化方法参数类型与父类的初始化方法参数类型不同时,我们就不必在子类的初始化方法前加override修饰符了,但是要把子类初始化方法的参数类型转换为符合父类初始化方法的参数类型,然后传给父类的初始化方法:

class MyClass {
    var str:String
    init(str:String) {
        self.str = str
    }
}

class MySubClass:MyClass
{
    init(i:Int) {
        super.init(str:String(i))
    }
}

MySubClass(i: 10)

required修饰符

我们给父类的init()方法加上required修饰符后会发生什么呢,我们来看看:

class MyClass {
    var str:String
    required init(str:String) {
        self.str = str
    }
}

class MySubClass:MyClass
{
    init(i:Int) {
        super.init(str:String(i))
    }
     // 编译错误
}

MySubClass(i: 10)

我们可以看到上面的代码在编译会发生错误,因为我们没有实现父类中要去必须要实现的方法。我们应该这样写:

class MyClass {
    var str:String
    required init(str:String) {
        self.str = str
    }
}

class MySubClass:MyClass
{
    required init(str:String) {
        super.init(str: str)
    }

    init(i:Int) {
        super.init(str:String(i))
    }
     
}

MySubClass(i: 10)

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

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

class MyClass {
    var str:String
    required init(str:String) {
        self.str = str
    }
}

class MySubClass:MyClass
{


}

MySubClass(str: "hello swift")

在这种情况下,编译器不会报错,因为如果子类没有任何初始化方法时,Swift会默认使用父类的初始化方法。在Apple的文档中也有相关描述:

You do not have to provide an explicit implementation of a required initializer if you can satisfy the requirement with an inherited initialiser.

required修饰符的使用规则

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

Swift中避免重载的final修饰符

Swift中的final修饰符可以防止类(class)被继承,还可以防止子类重写父类的属性、方法以及下标。需要注意的是,final修饰符只能用于类,不能修饰结构体(struct)和枚举(enum),因...
  • magic_castle
  • magic_castle
  • 2015年12月28日 01:01
  • 353

关于required 修饰符

有时候偶尔看到这个修饰符 一直没注意去看  不想 今天看到  王巍  的swift书 就随便记一下  以备以后查看 下面是一段示例代码 class MyClass {    var str:Stri...
  • wmmhwj
  • wmmhwj
  • 2016年08月29日 15:15
  • 248

Swift中的required修饰符

普通子类 通常情况下,一说到required修饰符,我们最先想到的应该就是普通类(class)的init()方法了。比如下面这个类: class MyClass { var str...
  • yongyinmg
  • yongyinmg
  • 2014年09月29日 17:53
  • 12880

Swift 中修饰符权限大小

Swift 中修饰符的权限大小Swift 中修饰符的权限大小 各个修饰符的区别 5种修饰符访问权限排序在Swift语言中,目前有五种修饰符,分别为fileprivate,private,interna...
  • lxhxhxhxh
  • lxhxhxhxh
  • 2017年05月16日 11:15
  • 419

Java中访问权限修饰符protected, default

作用域   当前类    同package   子孙类 其他package  public √   √  √ √  prot...
  • u013238950
  • u013238950
  • 2016年03月18日 00:04
  • 2552

Swift 类的继承 convenience required

看下面的代码 class Person { var name: String var health:Int = 100 { didSet{ if...
  • qq_18674153
  • qq_18674153
  • 2017年02月18日 16:52
  • 690

Swift required

http://www.thinksaas.cn/topics/0/440/440373.html http://blog.csdn.net/zhangchunxinzcx/article/detai...
  • allanGold
  • allanGold
  • 2017年05月04日 18:38
  • 192

九、swift3.0可选类型+类型修饰符及其它

一、
  • cwhzm
  • cwhzm
  • 2017年08月06日 17:25
  • 162

protobuf协议的Required,Optional,Repeated限定修饰符

protobuf Required Optional Repeated
  • chenglian1987
  • chenglian1987
  • 2016年10月08日 10:35
  • 491

“Use Legacy Swift Language Version” (SWIFT_VERSION) is required to be configured 这个错误解决方案

我遇到了,所以和大家分享一下。遇到这个错误,网上一大推粘贴复制,我也是够了,报错提示你怎么做,这个还用教,你基本就可以告别电脑了 个人觉得就是两种情况 项目完成后,突然报错这个时候报错肯定是你改什么...
  • qq_27873515
  • qq_27873515
  • 2017年04月24日 17:55
  • 4148
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Swift中的required修饰符
举报原因:
原因补充:

(最多只允许输入30个字)