我可以在协议中使用 init 函数吗?

84

当我尝试这样实现我的协议:

protocol Serialization {
    func init(key keyValue: String, jsonValue: String)
}

我收到一个错误提示:在函数声明中期望标识符。

我为什么会收到这个错误?


你为什么想要在协议中加入这个?它关心类型是如何创建的吗? - mmmmmm
4
一个对象可以有多个初始化函数。为什么不将其中一个初始化函数指定为符合某个协议的可调用函数呢? - Aaron Bratcher
8
那是因为init之前有func关键字。去掉它然后再试一次。 - Windor C
1
@Mark:例如,NSCoding - newacct
谢谢你,Windor。就这样了。 - Aaron Bratcher
2个回答

135
可以,但您永远不应该在init前加上func
protocol Serialization {
    init(key keyValue: String, jsonValue: String)
}

1
你能解释一下为什么不在init前面加上func吗?谢谢。 - LiweiZ
6
@LiweiZ: 因为初始化函数和方法是分开的。 - newacct
1
谢谢。我想我需要再仔细阅读一遍开发者文档 :) - LiweiZ
3
好的,Swift 因其风格一致性而闻名,但对于新手来说,这种不一致性很不一致且令人困惑。谢谢你的答复。 - Jay Imerman

44

重点:

  1. 协议以及实现它的类中, 永远不会init 方法前加上关键字 func
  2. 在您的类中,由于协议中调用了 init 方法,因此现在需要在 init 方法前加上关键字 required。这表示您遵循的协议要求您具有该 init 方法(即使您可能独立考虑到这是一个好主意)。

正如其他人所介绍的,您的协议应该像这样:

protocol Serialization {
    init(key keyValue: String, jsonValue: String)
}

例如,符合该协议的类可能如下所示:

class Person: Serialization {
    required init(key keyValue: String, jsonValue: String) {
       // your logic here
    }
}

注意在init方法前面有required关键字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接