gpt4 book ai didi

swift - 我怎样才能分解一个大的 init (由于大量的计算),以获得更好的可读性?

转载 作者:行者123 更新时间:2023-11-28 05:50:37 26 4
gpt4 key购买 nike

我有一个类,有 100 个属性(夸张)。大多数这些属性必须根据用户偏好进行计算。

这些属性在初始化后不会改变,这就是为什么我想在一开始就运行一次计算,并将结果设置到let属性中

用户可以设置数十个偏好,根据偏好设置的组合,当我初始化一个对象时,这里的属性会发生变化。

let prop1:String
let prop2:String
...
let prop100:String

init(maybeRelevantArg:Int, maybeRelevantArg2:String) {
var proposedProp1 = ""
//20 lines of logic to compute proposedProp1, referencing preferences and maybeRelevantArgs
self.prop1 = proposedProp1

var proposedProp2 = ""
//20 lines of logic to compute proposedProp2, referencing preferences and maybeRelevantArgs
self.prop2 = proposedProp2
}

你明白了,此时我的 init 将有数百行,基本上不可读。

我想将这些逻辑 block 分离到单独的方法中,例如:

init(maybeRelevantArg:Int, maybeRelevantArg2:String) {
self.computeAndSetProp1(relevantArg:maybeRelevantArg1)
self.computeAndSetProp2(relevantArg:maybeRelevantArg2)
}

func computeAndSetProp1(relevantArg:String) {
var proposedProp1 = ""
//20 lines of logic to compute proposedProp1, referencing preferences and relevantArgs
self.prop1 = proposedProp1
}

这样 init 就更易读了,也更容易调试和维护。

问题是显然编译器不会高兴我的 init 方法没有显式初始化这些属性,我得到类似于:

'self' used before all stored properties are initialized

而且,在 computeAndSetProp1() 中,我会得到这个错误:

cannot assign to property: 'prop1' is a 'let' constant

有没有办法拆分这个大的 init?

最佳答案

您可以使 computeAndSetProp1() 函数成为一个自由函数(即,不属于任何类),如下所示:

func computeAndSetProp1(relevantArg: String) -> String {
var proposedProp1 = ""
//20 lines of logic to compute proposedProp1, referencing preferences and relevantArgs
return proposedProp1;
}

class someClass: NSObject {
let prop1 : String
let prop2 : String
override init() {
prop1 = computeAndSetProp1(relevantArg: "x")
//...etc.
}
}

我还建议您查看是否可以概括 computeAndSetProp* 函数以减少代码量。您可以随时在 Code Review 上发布代码以获得有关如何简化代码的更多想法。

关于swift - 我怎样才能分解一个大的 init (由于大量的计算),以获得更好的可读性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53111642/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com