代码之家  ›  专栏  ›  技术社区  ›  A O

如何将结构初始化中的属性设置移到其他方法中

  •  2
  • A O  · 技术社区  · 6 年前

    所以我有一个结构,调用 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 ,

    我也希望初始值是 fallable ,所以它可以返回 nil 如果某些检查失败,那么我不确定如何用这个实现来实现它,正如我所做的那样 设置比例2 回来吧,那我怎么打电话呢( 初始化 )返回 ?

    我想我要做的一定是可能的,但我只是不知道编译器正在寻找的语法。或者,我可以将这20行逻辑拉到它自己的方法中,并让这两行都调用它,这样也会更干净,但因为这两行都调用 self.prop2 最后,我希望能有一种方法,只在一个地方 自我支持2 已分配

    1 回复  |  直到 6 年前
        1
  •  2
  •   Kelvin Lau    6 年前

    问题似乎是因为可变集函数可以在设置属性之前提前返回。我建议创建一个配置prop2并返回成功配置的prop或 nil 对于不成功的配置:

    func setProp2(_ prop2: String) -> Prop2? {
      // set up 
      return prop2
    }
    

    现在你可以打电话了 setProp2 来自初始值设定项和可变集函数。这就减轻了重复代码的问题。