所以我有一个结构,称为DemoType
,我希望调用者使用两个属性对其进行初始化-但是我也想公开设置第二个属性的能力
问题在于,在设置prop2
之前,有很多逻辑需要首先运行。 这意味着有很多重复的代码行,我正尝试通过将逻辑放在一个位置来减少这些重复行。我想将其全部保留在setProp2
struct DemoType {
var prop1: String
var prop2: String
init?(p1:String, p2:String) {
self.prop1 = p1
let potentialFailure = true
guard potentialFailure else { return nil }
// Like 20 lines of logic here manipulating p2
self.prop2 = p2
}
mutating func setProp2(_ p2:String) {
let potentialFailure = true
guard potentialFailure else { return }
// Like 20 lines of logic here manipulating p2
self.prop2 = p2
}
}
因此,从逻辑上讲,我可以打电话给setProp
,一切都会变得很酷
struct DemoType {
var prop1: String
var prop2: String
init?(p1:String, p2:String) {
self.prop1 = p1
self.setProp2(p2)
}
mutating func setProp2(_ p2:String) {
let potentialFailure = true
guard potentialFailure else { return }
// Like 20 lines of logic here manipulating p2
self.prop2 = p2
}
}
不幸的是,编译器会抱怨我没有初始化init
中的所有属性,
和,我也希望init为fallable
,因此如果某些检查失败,它可以返回nil
,所以我不确定该如何处理此实现,因为我可以使setProp2
刚返回,但是如何使调用者(init
)返回nil
?
我想我想做的事一定是可能的,但是我只是不知道编译器正在寻找的语法。或者,我可以将这20行逻辑提取到它自己的方法中,并都调用它,这样也会更简洁,但是由于最后都调用了self.prop2
,所以我希望有一种方法可以在一个分配了self.prop2
的地方
答案 0 :(得分:2)
问题似乎是因为您的变异set函数可以在设置属性之前提前返回。我建议创建一个配置prop2的函数,并返回配置成功的prop或返回nil
的不成功配置:
func setProp2(_ prop2: String) -> Prop2? {
// set up
return prop2
}
现在,您既可以从初始化程序中也可以从变异集合函数中调用setProp2
。这样可以减轻重复代码的问题。