Swift编译器无法区分两个初始化器,调用报错求助
问题分析与解决方案
嘿,我一眼就瞅出问题出在哪啦!核心原因是你的初始化器参数标签和调用方式不匹配。
先看看你定义的便捷初始化器:
convenience init (Read _: Bool) { // 读取内容并调用其他初始化器 }
这里的Read是外部参数标签,下划线_表示这个参数没有内部参数名(其实更建议给个内部名比如read,方便你在初始化器里用)。Swift对初始化器的参数标签匹配要求很严格,你直接写var something = UserData(true)时,编译器找不到一个「不带外部标签、接受Bool参数」的初始化器,自然就会报错“无法将Bool转换为UserData”。
两种解决办法任你挑:
办法1:按定义的标签调用
如果你想保留Read这个外部标签,调用时必须带上它:
var something = UserData(Read: true)
办法2:修改初始化器,去掉外部标签
如果你希望调用时能直接传Bool值不用写标签,把初始化器的外部标签也改成下划线就行(顺便给个内部参数名,写逻辑更方便):
class UserData { // 假设你有这些属性和基础初始化器 var name: String var age: Int init(name: String, age: Int) { self.name = name self.age = age } // 拷贝初始化器 init(_ origin: UserData) { self.name = origin.name self.age = origin.age } // 修改后的便捷初始化器:外部无标签,内部参数名read convenience init(_ read: Bool) { // 这里调用指定初始化器,替换成你实际的默认值或读取逻辑 self.init(name: "默认名称", age: 0) if read { // 从文件读取数据的逻辑,比如覆盖name和age } } } // 现在就能正常调用啦 var something = UserData(true)
另外提个小建议:Swift的参数标签建议用小写开头(比如read而非Read),这是官方推荐的代码风格哦~
内容的提问来源于stack exchange,提问作者qileng
相关产品推荐
相关产品推荐

