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中的required修饰符

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

Swift中的required修饰符

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

Swift中的required修饰符

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

protobuf的配置原始文件.proto中,使用修饰符repeated、required、optional生成的java文件的区别

最近在做一个基于Netty框架的项目。 该项目使用了Google的Protobuf作为编解码的框架。(没有使用XML或者json是为了更好的提高效率)。 经过了一段时间的使用我对Protobuf的原始...
  • lxlhu
  • lxlhu
  • 2015年04月20日 11:01
  • 2619

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

要通信,必须有协议,否则双方无法理解对方的码流。在protobuf中,协议是由一系列的消息组成的。因此最重要的就是定义通信时使用到的消息格式。 Protobuf消息定义 消息由至少一个字段组合而成...
  • guyue35
  • guyue35
  • 2016年04月18日 18:46
  • 5849

芒果iOS开发之ReactiveCocoa:Use Legacy Swift Language Version” (SWIFT_VERSION) is required to be configure

【主要内容:】 1. 错误起因 2. 错误提示 3. 解决问题办法 一、错误起因: 项目在Xcode8中使用了ReactiveCoco...

【iOS】Swift LAZY 修饰符和 LAZY 方法

延时加载或者说延时初始化是很常用的优化方法,在构建和生成新的对象的时候,内存分配会在运行时耗费不少时间,如果有一些对象的属性和内容非常复杂的话,这个时间更是不可忽略。另外,有些情况下我们并不会立即用到...

自学swift (2) ---修饰符(后续补充中)

1.private(set) 在var或subscript定义作用域之前,你可以通过private(set)或internal(set)先为它们的set权限申明一个较低的访问级别。private(...
  • msmwncx
  • msmwncx
  • 2016年07月13日 13:38
  • 194

Swift 基本知识之十九 swift懒加载(lazy修饰符)

延时加载或者说延时初始化是很常用的优化方法,在构建和生成新的对象的时候,内存分配会在运行时耗费不少时间,如果有一些对象的属性和内容非常复杂的话,这个时间更是不可忽略。另外,有些情况下我们并不会立即用到...

Swift - 访问控制(fileprivate,private,internal,public,open) 2015-01-13发布:hangge阅读:16010 在 Swift 语言中,访问修饰符

原文地址:http://www.hangge.com/blog/cache/detail_524.html Swift - 访问控制(fileprivate,private,inte...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Swift中的required修饰符
举报原因:
原因补充:

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