swift - 如何满足包含初始值设定项的协议(protocol)?

标签 swift initialization initializer

我定义了一个简单的类:

class MyClass {
    var name:String?

    required init() {
        println("init")
    }
}

我可以像这样在扩展中添加一个新的初始化器:

extension MyClass {
    convenience init(name: String) {
        self.init()
        self.name = name
    }
}

一切正常。

但是一旦我在协议(protocol)中定义了新的初始值设定项:

protocol MyProtocol {
    init(name:String)
}

并使我的扩展符合该协议(protocol):

extension MyClass : MyProtocol {
    convenience init(name: String) {
        self.init()
        self.name = name
    }
}

我收到以下错误:

Initializer requirement 'init(name:)' can only be satisfied by a required initializer in the definition of non-final class 'MyClass'

这是怎么回事?

(顺便说一句:我不能让我的类final,因为这只是一个更复杂的用例的摘录。)

最佳答案

好吧,我的错。

为了保证所有子类都符合MyProtocol,新的初始化器也必须被标记为required

此外,Swift 要求直接在类中声明所有必需的初始化器,不允许在扩展中声明它们。

extension MyClass : MyProtocol {
    required convenience init(name: String) {
        self.init()
        self.name = name
    }
}

关于swift - 如何满足包含初始值设定项的协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26578664/

相关文章:

ios - iOS 5+ 中的 Objective-C 单例模式

ios - 登录 Realm Mobile Platform 后弹出 View Controller

ios - 如何在自定义动画中访问 toView 对象的框架

ios - 将 JSON 数据转换为字典

ios - 使用 requestLocation 仅请求一次用户位置

c++ - 为什么 const 左值引用可以引用可变右值引用?

c - 如何从 C 结构体数组中初始化单个元素?

c++ - `const std::string& s = nullptr` 作为可选参数如何工作

c++ - 从另一个成员函数/构造函数调用 C++ 构造函数是否执行初始化列表?

c# - List <myCustomClass>的集合初始值设定项无法正常工作,给出 “; expected”编译错误。为什么?