Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 我可以在协议中使用init func吗?_Swift_Initialization_Protocols_Swift Protocols - Fatal编程技术网

Swift 我可以在协议中使用init func吗?

Swift 我可以在协议中使用init func吗?,swift,initialization,protocols,swift-protocols,Swift,Initialization,Protocols,Swift Protocols,当我尝试以这种方式实施协议时: protocol Serialization { func init(key keyValue: String, jsonValue: String) } 我得到一个错误,说:函数声明中需要标识符。 为什么会出现此错误?是的,您可以。但是您从未将func放在init前面: protocol Serialization { init(key keyValue: String, jsonValue: String) } 这里的要点是: 协议和实现它

当我尝试以这种方式实施协议时:

protocol Serialization {
    func init(key keyValue: String, jsonValue: String)
}
我得到一个错误,说:函数声明中需要标识符。


为什么会出现此错误?

是的,您可以。但是您从未将
func
放在
init
前面:

protocol Serialization {
    init(key keyValue: String, jsonValue: String)
}
这里的要点是:

  • 协议和实现它的类在
    init
    方法前面从来没有关键字
    func
  • 在您的类中,由于在协议中调用了
    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关键字。

    为什么要在协议中使用该关键字?为什么它关心类型是如何创建的?一个对象可以有多个init函数。为什么不让协议指定一个可以被调用的函数呢?这是因为
    func
    关键字正好在
    init
    之前。删除它,然后再试一次。@马克:例如,
    NSCoding
    Thank Windor。就是这样。你能解释一下为什么不把func放在init前面吗?谢谢。@LiweiZ:因为初始值设定项和方法是分开的,谢谢。我想我需要再看一次开发者文档:)好的,Swift以其风格一致性而闻名,这对新手来说是非常不一致和混乱的。谢谢你的回答。