Swift中如何实现类的可选参数初始化,无需传入全部参数
在Swift中实现类的可选参数初始化(类似Dart的命名可选参数)
你想要让Swift类的可选类型变量支持选择性传入参数完成初始化,不需要强制传所有变量,就像你给出的Dart代码那样,这里有两种简洁的实现方式:
方式一:给初始化器参数设置默认值(推荐)
直接给初始化器的参数指定默认值nil,因为你的类属性本身就是String?类型,完全匹配。这样调用时可以自由选择传入哪些参数:
var studentOne = Student(name: "Unnamed 1", degree: "test") // 正常工作 var studentTwo = Student(name: "Unnamed 2") // 仅传入name,degree默认nil var studentThree = Student(degree: "Master") // 仅传入degree,name默认nil var studentFour = Student() // 不传任何参数,两个属性均为nil studentTwo.printValues() class Student{ var name : String? var degree : String? // 给参数设置默认值nil,支持可选传入 init(name: String? = nil, degree: String? = nil) { self.name = name self.degree = degree } func printValues(){ print("name: \(name ?? "未设置") and \(degree ?? "未设置")") } }
这种方式和你提供的Dart代码逻辑完全一致:调用时必须使用命名参数(name:、degree:),未传入的参数会自动使用默认值nil,完全符合你的需求,是正确的实现方式。
方式二:使用便利初始化器(保留原有初始化器时用)
如果需要保留原来强制传两个参数的初始化器,同时新增可选传参的初始化逻辑,可以用便利初始化器:
var studentOne = Student(name: "Unnamed 1", degree: "test") // 原初始化器仍可用 var studentTwo = Student(name: "Unnamed 2") // 新的可选传参初始化器 studentTwo.printValues() class Student{ var name : String? var degree : String? // 原有的强制传参初始化器 init(name : String, degree: String ) { self.name = name self.degree = degree } // 便利初始化器,支持可选传参 convenience init(name: String? = nil, degree: String? = nil) { // 调用指定初始化器,若原初始化器要求非可选String,可传入默认空字符串 self.init(name: name ?? "", degree: degree ?? "") // 若原初始化器也改为支持可选参数,方式一更简洁 } func printValues(){ print("name: \(name) and \(degree)") } }
总结
给初始化器参数设置默认值nil是最直接且正确的做法,既符合Swift的类型安全规则,又完美实现了你想要的可选传参效果,和Dart代码的行为完全对齐。
内容的提问来源于stack exchange,提问作者Lucas Barreto Luz
相关产品推荐
相关产品推荐

