协议中的默认初始化器

Default initializer in protocol

我想为协议中的初始值设定项指定一个默认实现,这样我就可以运行对符合特定协议的所有结构进行编码。

我有以下例子:

protocol ProtWithInit {
    init()
}

extension ProtWithInit {
    init() {
        self.init()
        print("Hello protocol")
    }
}

struct MyStruct {}

extension MyStruct: ProtWithInit {}

let myStruct = MyStruct()

我希望 MyStruct() 调用执行的操作是输出“Hello 协议”。但是,当我 运行 上述代码时,没有任何输出。

此外,我想添加到结构中的初始化程序。因此,例如在结构中,我将 print("Hello struct") 添加到初始化程序,然后这将输出 hello protocolhello struct.

有什么办法可以实现吗?

如果它做了任何事情,这将是一个无限循环:

extension ProtWithInit {
    init() {
        self.init()
        print("Hello protocol")
    }
}

结构和协议不是 class。他们没有 class-like 继承权。 (即使这是 class,这也将是一个无限循环,因为 self.init() 只会再次调用 init()。)

回到你的调用代码,你说的代码“这样我就可以 运行 对所有符合特定协议的结构进行编码。” 代码是什么样的。它对真实类型的实际要求是什么?用它来制定你的协议。例如,以下内容与您所描述的类似:

extension ProtWithInit {
    static func create() -> Self {
        print("Hello protocol")
        return Self.init()
    }
}

let myStruct = MyStruct.create()