首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >必须由子类重写的Swift类方法

必须由子类重写的Swift类方法
EN

Stack Overflow用户
提问于 2014-06-09 06:07:37
回答 8查看 58.3K关注 0票数 107

在Swift中有没有一种标准的方法来创建一个“纯虚拟函数”,即。一个是必须被每个子类覆盖的,如果不是这样,会导致编译时错误?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2014-06-09 06:18:06

您有两个选择:

1.使用协议

将超类定义为协议而不是类

Pro:编译时检查每个“子类”(不是实际的子类)是否实现了所需的方法

Con:“超类”(协议)不能实现方法或属性

2.在方法的超级版本中断言

示例:

代码语言:javascript
运行
复制
class SuperClass {
    func someFunc() {
        fatalError("Must Override")
    }
}

class Subclass : SuperClass {
    override func someFunc() {
    }
}

Pro:可以在超类中实现方法和属性

Con:无编译时检查

票数 169
EN

Stack Overflow用户

发布于 2018-07-14 07:19:22

下面的代码允许从类继承,还允许对协议的编译时进行检查:)

代码语言:javascript
运行
复制
protocol ViewControllerProtocol {
    func setupViews()
    func setupConstraints()
}

typealias ViewController = ViewControllerClass & ViewControllerProtocol

class ViewControllerClass : UIViewController {

    override func viewDidLoad() {
        self.setup()
    }

    func setup() {
        guard let controller = self as? ViewController else {
            return
        }

        controller.setupViews()
        controller.setupConstraints()
    }

    //.... and implement methods related to UIViewController at will

}

class SubClass : ViewController {

    //-- in case these aren't here... an error will be presented
    func setupViews() { ... }
    func setupConstraints() { ... }

}
票数 63
EN

Stack Overflow用户

发布于 2014-06-09 06:15:39

没有任何对抽象类/虚函数的支持,但是你可以在大多数情况下使用协议:

代码语言:javascript
运行
复制
protocol SomeProtocol {
    func someMethod()
}

class SomeClass: SomeProtocol {
    func someMethod() {}
}

如果SomeClass没有实现someMethod,你会得到这个编译时错误:

代码语言:javascript
运行
复制
error: type 'SomeClass' does not conform to protocol 'SomeProtocol'
票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24111356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档