Swift中为何不能用init关键字定义协议和枚举的方法?
Swift中init关键字作为函数名的问题解答
为什么会报错?
init是Swift的专用关键字,它唯一的用途是定义类型的初始化器(构造函数),语法上有严格规则:
- 初始化器不需要加
func关键字 - 初始化器不能用
static/class修饰(初始化器是用来创建实例的,本身属于实例构造逻辑,不是静态方法)
你尝试写static func init(value: String),本质是把关键字当作普通函数名使用,这违反了Swift的语法规则,所以Xcode会提示“Keyword init cannot be used as an identifier here!”。
`init`和init的区别
注意:Xcode修正后的其实是反引号包裹的init(即`init`,可能你输入时误写成单引号),它和裸写的init有本质区别:
- 裸写的
init是关键字,只能用于定义初始化器,不能当作普通函数名 - 反引号包裹的
`init`是普通标识符,不再具备关键字的特殊属性,只是一个和其他名字(比如setup)一样的函数名。Swift允许用反引号把关键字“转义”成合法的标识符,这样就能用它来命名函数、变量,但这时候它就是个普通静态方法,和初始化器没有任何关系。
示例修正代码
协议修正后:
protocol Initializable { static func `init`(value: String) }
枚举修正后:
enum MyEnum { case a, b, c static func `init`(value: String) { } }
不过不推荐这么做,因为会混淆初始化器和普通方法的语义,建议改用更清晰的名字,比如initFromString、create(with:)等。
内容的提问来源于stack exchange,提问作者swiftPunk
相关产品推荐
相关产品推荐

